美文网首页
定时器 NSTimer

定时器 NSTimer

作者: 流沙3333 | 来源:发表于2017-03-02 16:55 被阅读15次

//使用scheduledTimerWithTimeInterval方法会把timer添加到mainRunLoop,但是其模式是NSDefaultRunLoopMode,当主线程忙的时候是不会执行该定时器的。

NSTimer*timer = [NSTimer  scheduledTimerWithTimeInterval:60  target:self   selector:@selector(setupUnreadCount)   userInfo:nil  repeats:YES];

//改变定时器的模式为NSRunLoopCommonModes,该模式下主线程会抽时间处理一下timer(不管主线程是否正在其他事件)

[[NSRunLoop  mainRunLoop] addTimer:timer  forMode:NSRunLoopCommonModes];

NSTimer的初始化、暂停、继续和终结

初始化

NSTimer的初始化一般都是使用类方法,类方法有四个,主要区别就是是否使用scheduled和NSInvocation。

先说scheduled,初始化时使用了scheduled就就相当于以默认mode添加到NSRunLoop中,初始化后指定方法会被直接调用,

未使用scheduled不会直接调用指定方法,需要调用[NSRunLoop  currentLoop]的方法addTimer:forMode:方法,

手动把NSTimer对象添加到NSRunLoop中后才会调用指定方法。

接下来再说NSInvocation的作用,使用selector只能传递一个参数,但是当你的方法需要传递多个参数时怎么办?

这时就需要用到NSInvocation了,NSInvacation可以实现方法的多参数传递,具体用法我就不在这里多说了,读者可以自行查找。

除了上面说的4个类方法外,NSTimer还有一个对象方法,利用FireDate进行初始化,内容很简单无歧义,不再多说。

暂停

NSTimer没有提供直接的暂停方法,我们只有自己想办法来间接实现暂停效果,这里采用的方法就是利用NSTimer的属性fireDate。

fireDate的作用就是在指定的时间开启NSTimer。只要我们设置的开启时间够长,作用就相当于是暂停了。

[_timer  setFireDate:[NSDate distantFuture]];

继续

NSTimer的继续原理和暂停是一样的,都是利用FireDate。

[_timer setFireDate:[NSDate date]];

终结

NSTimer的终结,系统给了方法

[_timer invalidate];

_timer = nil;

相关文章

网友评论

      本文标题:定时器 NSTimer

      本文链接:https://www.haomeiwen.com/subject/zwlkgttx.html