首页 > 代码库 > IOS中定时器NSTimer的开启与关闭
IOS中定时器NSTimer的开启与关闭
调用一次计时器方法:
?
1 2 | myTimer = [ NSTimer scheduledTimerWithTimeInterval:1.5 target: self selector: @selector (scrollTimer) userInfo: nil repeats: NO ]; //不重复,只调用一次。timer运行一次就会自动停止运行 |
重复调用计时器方法:
?
1 2 | timer = [ NSTimer scheduledTimerWithTimeInterval:1.0 target: self selector: @selector (function:) userInfo: nil repeats: YES ]; //每1秒运行一次function方法。 <span style="line-height: 1.5;"> </span> |
注意:将计数器的repeats设置为YES的时候,self的引用计数会加1。因此可能会导致self(即viewController)不能release,所以,必须在viewWillAppear的时候,将计数器timer停止,否则可能会导致内存泄露。
停止timer的运行,但这个是永久的停止:
?
1 2 | //取消定时器 [timer invalidate]; |
要想实现:先停止,然后再某种情况下再次开启运行timer,可以使用下面的方法:
首先关闭定时器不能使用上面的方法,应该使用下面的方法:
?
1 2 | //关闭定时器 [myTimer setFireDate:[ NSDate distantFuture]]; |
然后就可以使用下面的方法再此开启这个timer了:
?
1 2 | //开启定时器 [myTimer setFireDate:[ NSDate distantPast]]; |
例子:比如,在页面消失的时候关闭定时器,然后等页面再次打开的时候,又开启定时器。
(主要是为了防止它在后台运行,暂用CPU)可以使用下面的代码实现:
?
1 2 3 4 5 6 7 8 9 10 11 12 13 | //页面将要进入前台,开启定时器 -( void )viewWillAppear:( BOOL )animated { //开启定时器 [scrollView.myTimer setFireDate:[ NSDate distantPast]]; } //页面消失,进入后台不显示该页面,关闭定时器 -( void )viewDidDisappear:( BOOL )animated { //关闭定时器 [scrollView.myTimer setFireDate:[ NSDate distantFuture]]; } |
OK,搞定。
官方接口
?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | @interface NSTimer : NSObject //初始化,最好用scheduled方式初始化,不然需要手动addTimer:forMode: 将timer添加到一个runloop中。 + ( NSTimer *)timerWithTimeInterval:( NSTimeInterval )ti invocation:( NSInvocation *)invocation repeats:( BOOL )yesOrNo; + ( NSTimer *)scheduledTimerWithTimeInterval:( NSTimeInterval )ti invocation:( NSInvocation *)invocation repeats:( BOOL )yesOrNo; + ( NSTimer *)timerWithTimeInterval:( NSTimeInterval )ti target:( id )aTarget selector:( SEL )aSelector userInfo:( id )userInfo repeats:( BOOL )yesOrNo; + ( NSTimer *)scheduledTimerWithTimeInterval:( NSTimeInterval )ti target:( id )aTarget selector:( SEL )aSelector userInfo:( id )userInfo repeats:( BOOL )yesOrNo; - ( id )initWithFireDate:( NSDate *)date interval:( NSTimeInterval )ti target:( id )t selector:( SEL )s userInfo:( id )ui repeats:( BOOL )rep; - ( void )fire; //立即触发定时器 - ( NSDate *)fireDate; //开始时间 - ( void )setFireDate:( NSDate *)date; //设置fireData,其实暂停、开始会用到 - ( NSTimeInterval )timeInterval; //延迟时间 - ( void )invalidate; //停止并删除 - ( BOOL )isValid; //判断是否valid - ( id )userInfo; //通常用nil @end |
暂停与继续
?
1 2 3 | [timer setFireDate:[ NSDate date]]; //继续。 [timer setFireDate:[ NSDate distantPast]]; //开启 [timer setFireDate:[ NSDate distantFuture]]; //暂停 |
使用NSTimer实现倒计时的一个例子:
-(void)viewDidLoad中添加如下代码,每秒出发一次
?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | [ NSTimer scheduledTimerWithTimeInterval:1.0 target: self selector: @selector (timerFireMethod:) userInfo: nil repeats: YES ]; - ( void )timerFireMethod:( NSTimer *)theTimer { NSCalendar *cal = [ NSCalendar currentCalendar]; //定义一个NSCalendar对象 NSDateComponents *endTime = [[ NSDateComponents alloc] init]; //初始化目标时间...奥运时间好了 [endTime setYear:2008]; [endTime setMonth:8]; [endTime setDay:8]; [endTime setHour:8]; [endTime setMinute:8]; [endTime setSecond:8]; NSDate *todate = [cal dateFromComponents:endTime]; //把目标时间装载入date [endTime release]; NSDate *today = [ NSDate date]; //得到当前时间 //用来得到具体的时差 unsigned int unitFlags = NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit | NSHourCalendarUnit | NSMinuteCalendarUnit | NSSecondCalendarUnit ; NSDateComponents *d = [cal components:unitFlags fromDate:today toDate:todate options:0]; NSLog (@ "%d年%d月%d日%d时%d分%d秒" ,[d year],[d month], [d day], [d hour], [d minute], [d second]); } |
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。