一、造成NSTimer
触发不准确的原因
- 在
run loops
循环过程中,被NSTimer
触发事件阻塞了,导致循环不能及时进行下去,延误之后NSTimer触发时间。 - 在
run loops
循环过程中,在某一时刻主线程发生了阻塞情况,导致循环不能及时进行下去,厌恶NSTimer
触发时间。 - 在
run loops
循环过程中,发生了模式的转换,(比如UIScrollView的滑动) 导致原有模式下的NSTimer
不会正常触发。
以上情况都是由于NSTimer
所依赖的run loops
会被多种原因干扰正常循环,所以要想解决NSTimer精度问题,就要避免所依赖的run loops
被外界干扰。
- 注意:虽然第三种情况可以指定
NSTimer
所处模式为NSRunLoopCommonModes
,但是这种解决方法并不能改变run loops
在特定模式下不能处理其余模式事件的本质。
二、终极解决办法
- 尽量避免将
NSTimer
放入容易受到影响的主线程run loops
中。 - 尽量避免将耗时操作放入
NSTimer
依赖的线程中。 - 尽量避免在
NSTimer
触发事件中进行耗时操作,如果不能避免,将耗时操作移至其余线程进行。