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

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。