NSTimer不准的问题及解决

Runloop Timer为什么不准?

1:Runloop Timer底层使用的timer精度不高;
2:与Runloop底层的调用机制有关系。

情况产生:
1、NSTimer被添加在mainRunLoop中,模式是NSDefaultRunLoopMode,mainRunLoop负责所有主线程事件,例如UI界面的操作,复杂的运算使当前RunLoop持续的时间超过了定时器的间隔时间,那么下一次定时就被延后,这样就会造成timer的阻塞、2:模式的切换,当创建的timer被加入到NSDefaultRunLoopMode时,此时如果有滑动UIScrollView的操作,runLoop 的mode会切换为TrackingRunLoopMode,这是timer会停止回调。

解决:
1:在子线程中创建timer,在主线程进行定时任务的操作或者在子线程中创建timer,在子线程中进行定时任务的操作,需要UI操作时切换回主线程进行操作。
2: CGD操作:dispatch_source_create,创建定时器,dispatch_source_set_timer :设置定时器。dispatch_resume:启动。
3:CADisplayLink(频率能达到屏幕刷新率的定时器类):displayLinkWithTargetaddToRunLoop

你可能感兴趣的:(NSTimer不准的问题及解决)