NSTimer整理总结

对于定时器NSTimer,我们大家都不会陌生,在使用的时候,我们常常会遇到一些坑,例如:在Scrollview拖动时,timer会暂停;在子线程中如何创建一个定时器等。针对于一些我们所遇到的坑,我来总结下NSTimer。

一、前提条件

  1. NSTimer的运行条件:timer能够成功的运行,它所依赖的环境是RunLoop,也就说timer必须存在一个RunLoop中,它才能够正常运行(关于RunLoop,点击这里)。
  2. NStimer的创建
  3.     // timer常用的创建方式有如下两种
        NSTimer *timer1 = [NSTimer scheduledTimerWithTimeInterval:<#(NSTimeInterval)#> repeats:<#(BOOL)#> block:<#^(NSTimer * _Nonnull timer)block#>];
        NSTimer *timer2 = [NSTimer timerWithTimeInterval:<#(NSTimeInterval)#> repeats:<#(BOOL)#> block:<#^(NSTimer * _Nonnull timer)block#>];
        // timer1的创建方式,默认会将timer1加入当前的RunLoop中,且该RunLoop的模式为kCFRunLoopDefaultMode。
        // timer2的创建方式,没有默认添加进入哪个RunLoop,需要自己手动添加进RunLoop中,且需要手动选择RunLoop的模式。

二、解释常见的坑。

  1. 关于Scrollview拖动时,Timer暂停:当Scrollview拖动时,Timer所在的RunLoop进入UITrackingRunLoopMode的模式,所以需要改变Timer所在RunLoop的模式,否则在UITrackingRunLoopMode模式下,RunLoop在运行时不会去检测Timer是否需要触发,从而导致定时器Timer暂停。
  2. 关于子线程中创建定时器:每一条线程都会有其对应的RunLoop,主线程的RunLoop是默认开启,而子线程的RunLoop是需要我们手动开启,所以在子线程中创建了定时器Timer没反应,是因为没有开启子线程的RunLoop而导致的。
  3. 关于NSTimer不精准的问题:由于Timer运行受困于RunLoop,而RunLoop在运行时,处理的事件不仅仅只有Timer,还有很多source等事件,在此情景下,RunLoop没办法保证准时的去检测Timer并触发,所以NSTimer的精准度存在误差。(想了解更加精准的定时器,点击这里
此文章为个人笔记,方便自己以及有需要的朋友查看,转载请注明出处!
原文地址:https://www.cnblogs.com/shpyoucan/p/6109682.html