NSTimer 和 Runloop Mode

NSTimer--UITableviewCell


大部分时间都会使用scheduledTimerWithTimeInterval:target:selector:userInfo:repeats来创建Timer,并且大部分时间都是能正常触发的。

但是当Timer和scrollView碰到一起的时候就会出现不能触发的情况,当把Timer的实现改为

_currentTimer = [NSTimer timerWithTimeInterval:1
                                             target:self
                                           selector:@selector(repeatSEL)
                                           userInfo:nil repeats:YES];
[[NSRunLoop mainRunLoop] addTimer:_currentTimer forMode:NSRunLoopCommonModes];

Timer就能完美的运行。虽然两次Timer都是在主线程上运行的,和scrollViewy依旧使用同一个Runloop但是因为Mode的不同造成了不同的结果。scheduledTimerWithTimeInterval触发是默认的ModeNSDefaultRunLoopMode

NSTimer 和 Runloop Mode_第1张图片

图示可以看出为什么Timer必须加入到Runloop中。因为Timer是也是一种资源,这种资源想起作用必须加入到runloop中,同理如果Runloop中不包含任何资源,运行该Runloop就会立即退出。

另外需要注意的一点就是同一线程的Runloop在运行的时候,任意时刻只能处于同一种mode。所以只能当程序处于这种mode的时候,timer才能得到触发事件的机会。

关于不同的Mode参看下图


NSTimer 和 Runloop Mode_第2张图片

你可能感兴趣的:(NSTimer 和 Runloop Mode)