IOS中定时器NSTimer的开启与关闭
时间:2014-05-09 08:50:29
收藏:0
阅读:473
调用一次计时器方法:
|
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]);} |
评论(0)