IOS中定时器NSTimer的开启与关闭
调用一次计时器方法:
1
2 |
myTimer = [ NSTimer
scheduledTimerWithTimeInterval:1.5 target: self
selector: @selector (scrollTimer) userInfo: nil
repeats: NO ]; //不重复,只调用一次。timer运行一次就会自动停止运行 |
重复调用计时器方法:
注意:将计数器的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]); } |
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。