各位大神碰到这个问题不要慌,大多是因为NSTimer的模式的问题
先看原理:
首先我们先来看看NSTimer的几个模式:
NSDefaultRunLoopMode(kCFRunLoopDefaultMode)
:默认,空闲状态UITrackingRunLoopMode
:ScrollView滑动时会切换到该ModeUIInitializationRunLoopMode
:run loop启动时,会切换到该modeNSRunLoopCommonModes(kCFRunLoopCommonModes)
:Mode集合- 苹果公开提供的Mode有两个:
NSDefaultRunLoopMode(kCFRunLoopDefaultMode)
NSRunLoopCommonModes(kCFRunLoopCommonModes)
我们知道,NSTimer运行会被加入到RunLoop中,如果创建的时候我们NSTimer对象以NSDefaultRunLoopMode(kCFRunLoopDefaultMode)添加到主运行循环中的话,当tableview滚动中mode会切换成UITrackingRunLoopMode
,从而导致NSTimer不会被调度。
所以解决这个问题,我们只需要在将NSTimer添加到RunLoop的时候,以NSRunLoopCommonModes的模式去添加就可以了!
扩展:
NSTimer 以 timerWithTimeInterval 创建和以 scheduledTimerWithTimeInterval 创建的区别
timerWithTimeInterval 类方法创建需要 程序员手动把定时器添加到RunLoop中
scheduledTimerWithTimeInterval类方法创建则无需手动,创建的时候就已经加入到RunLoop中了!