//使用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的初始化一般都是使用类方法,类方法有四个,主要区别就是是否使用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;
网友评论