NSTimer 的使用
为什么会写NSTimer呢?
原因很简单, 这里有坑!
NSTimer 使用的顺序
- 创建NSTimer
- 销毁NSTimer
- NSTimer和Runloop
- 创建NSTimer
NSTimer有三种创建的方式 :
这三种创建方式在现实工作使用中的使用频率是依次递增的.
- (instancetype)initWithFireDate:(NSDate *)date interval:(NSTimeInterval)ti target:(id)target selector:(SEL)aSelector userInfo:(id)userInfo repeats:(BOOL)repeats
+ (NSTimer *)timerWithTimeInterval:(NSTimeInterval)ti target:(id)target selector:(SEL)aSelector userInfo:(id)userInfo repeats:(BOOL)repeats
+ (NSTimer *)scheduledTimerWithTimeInterval:(NSTimeInterval)ti target:(id)target selector:(SEL)aSelector userInfo:(id)userInfo repeats:(BOOL)repeats
我们先从使用最多的scheduledTimer讲起, 当使用scheduledTimer这个方法的时候, 我们不仅仅是创建了一个NSTimer的对象, 还将这个定时器的对象加入到了当前的运行环runloop中.
NSTimer对象只有被加入到了当前的runloop中才会被执行
所以当你使用前两个方法的时候, 需要手动的将NSTimer对象加入到runloop中
销毁NSTimer
要在viewWillDisappear的时候将创建的NSTimer对象销毁掉
- (void)viewWillDisappear:(BOOL)animated {
super viewWillDisappear:animated;
_timer invalidate;
_timer = nil;
`}NSTimer 和 Runloop
runloop会运行在不同的mode, 简单来说有以下两种mode
• NSDefaultRunLoopMode, 默认的mode
• UITrackingRunLoopMode, 当处理UI滚动操作时的mode
通常情况下NSDefaultRunLoopMode和UITrackingRunLoopMode都已经被加入到了common modes集合中, 所以不论runloop运行在哪种mode下, NSTimer都会被及时触发. 所以我们在加入到当前线程
[[NSRunLoop currentRunLoop] addTimer:_timer forMode:NSRunLoopCommonModes];
时已经是加入了两种mode了, 此时你在滚动UI的时候是可以处理定时器的了