调用一次计时器方法:
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]);
} |