定时器 NSTimer

//使用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;

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容