NSTimer 知识点记录

来源:互联网 发布:淘宝爆款打造教程 编辑:程序博客网 时间:2024/06/03 19:56

声明:以下内容,大部分属于转载内容,仅供自己学习参考

定时器的概念和其他平台的概念无异,创建一个定时器、可暂停、继续和停止。计数值满了会调用指定的处理方法。

NSTimer其实是将一个监听加入到系统的RunLoop中去,当系统runloop循环执行到timer条件满足时,会调用timer一次,当timer执行完,也就是回调函数(处理方法)执行之后,timer会再一次的将自己加入到runloop中去继续监听。

CFRunLoopTimerRef 和 NSTimer这两个类型是可以互换的, 当我们在传参数的时候,看到CFRunLoopTimerRef可以传NSTimer的参数,增加强制转化来避免编译器的警告信息

一个timer对象在同一时间只能够被注册到一个runloop中,尽管在这个runloop中它能够被添加到多个runloop中模式中去。

定时器的创建有以下三种方法:

  1. scheduledTimerWithTimeInterval: invocation: repeats: 或者scheduledTimerWithTimeInterval: target: selector: userInfo: repeats: 这两个类方法创建一个timer,并把它指定到一个默认的runloop模式中

  2. timerWithTimeInterval:invocation:repeats: 或者 timerWithTimeInterval:target:selector:userInfo:repeats:这两个类方法创建一个timer的对象,不会把它添加到默认的runloop模式中。 (当创建之后,你必须手动的调用NSRunLoop下对应的方法 addTimer:forMode: 去将它制定到一个runloop模式中.)

  3. 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]);}
0 0