声明:以下内容,大部分属于转载内容,仅供自己学习参考
定时器的概念和其他平台的概念无异,创建一个定时器、可暂停、继续和停止。计数值满了会调用指定的处理方法。
NSTimer其实是将一个监听加入到系统的RunLoop中去,当系统runloop循环执行到timer条件满足时,会调用timer一次,当timer执行完,也就是回调函数(处理方法)执行之后,timer会再一次的将自己加入到runloop中去继续监听。
CFRunLoopTimerRef 和 NSTimer这两个类型是可以互换的, 当我们在传参数的时候,看到CFRunLoopTimerRef可以传NSTimer的参数,增加强制转化来避免编译器的警告信息
一个timer对象在同一时间只能够被注册到一个runloop中,尽管在这个runloop中它能够被添加到多个runloop中模式中去。
定时器的创建有以下三种方法:
scheduledTimerWithTimeInterval: invocation: repeats: 或者scheduledTimerWithTimeInterval: target: selector: userInfo: repeats: 这两个类方法创建一个timer,并把它指定到一个默认的runloop模式中。
timerWithTimeInterval:invocation:repeats: 或者 timerWithTimeInterval:target:selector:userInfo:repeats:这两个类方法创建一个timer的对象,不会把它添加到默认的runloop模式中。 (当创建之后,你必须手动的调用NSRunLoop下对应的方法 addTimer:forMode: 去将它制定到一个runloop模式中.)
initWithFireDate:interval:target:selector:userInfo:repeats: 方法分配并创建一个NSTimer的实例 (当创建之后,你必须手动的调用NSRunLoop下对应的方法 addTimer:forMode: 去将它制定到一个runloop模式中.)
target:(id) aTarget 表示发送的对象,如self
selector:(SEL)a Selector 方法选择器,在时间间隔内,选择调用一个实例方法
userInfo:(id)userInfo 此参数可以为nil,当定时器失效时,由你指定的对象保留和释放该定时器。
repeats:(BOOL)yes Or No 当YES时,定时器会不断循环直至失效或被释放,当NO时,定时器会循环发送一次就失效。
实例代码片段
//创建一个定时器,以10s 为间隔,时间到了会调用DownLoadThread方法。定时器一次计数完成,会继续加入runloop进行下一次计数
NSTimer time = [NSTimer timerWithTimeInterval:10 target:self selector:@selector(DownLoadThread:) userInfo:self repeats:YES ];
//将定时器添加到 当前的RunLoop中默认模式
[[NSRunLoop currentRunLoop] addTimer:time forMode:NSDefaultRunLoopMode];
[time fire];// 可以通过fire这个方法去触发timer,即使timer的firing time没有到达
[time setFireDate:[NSDate distanPast]] //NSTimer 开启
[time setFireDate:[NSDate distantFunture]] //NSTimer 关闭
//在invalidate之前最好先用isValid先判断是否还在线程中:
if ([scrollTimer isValid] == YES) {
[scrollTimer invalidate];
scrollTimer = nil;
}
//定时器暂停与继续的简要方法:
[time setFireDate:[NSDate date]]; //继续。
[time setFireDate:[NSDate distantPast]];//开启
[time setFireDate:[NSDate distantFuture]];//暂停
-(void)fire; //立即触发定时器
- (NSDate *)fireDate;//开始时间
- (void)setFireDate:(NSDate *)date;//设置fireData,其实暂停、开始会用到
- (NSTimeInterval)timeInterval;//延迟时间
- (void)invalidate;//停止并删除
- (BOOL)isValid;//判断是否valid
- (id)userInfo;//通常用nil
使用NSTimer实现倒计时的一个例子:
在viewDidLoad中添加如下代码,每秒出发一次
[NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(timerFireMethod:) userInfo:nil repeats:YES]; //使用timer定时,每秒触发一次,然后就是写selector了,时间到达调用timerFireMethod方法。
- (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]);
}