NSTimer与NSRunloop平时的运用
一, 简单的了解NSRunloop
从字面上看:运行循环、跑圈
其实它内部就是do-while循环,在这个循环内部不断的处理各种任务(比如Source、Timer、Observer)
一个线程对应一个RunLoop,主线程的RunLoop默认已经启动,子线程的RunLoop需要手动启动(调用run方法)
RunLoop只能选择一个Mode启动,如果当前Mode中没有任何Soure、Timer、Observer,那么就直接退出RunLoop
二, 需要了解NSRunloop常用的Model:
NSDefaultRunLoopMode; NSRunLoopCommonModes.开发中运用最多的就是这两种,想深入了解的可以多看一些大牛的技术博客,小白技术有限,就不坑谁谁了.
三, 定时器的创建
方法一: + (NSTimer *)timerWithTimeInterval:(NSTimeInterval)ti target:(id)aTarget selector:(SEL)aSelector userInfo:(nullable id)userInfo repeats:(BOOL)yesOrNo;
方法二: + (NSTimer *)scheduledTimerWithTimeInterval:(NSTimeInterval)ti target:(id)aTarget selector:(SEL)aSelector userInfo:(nullable id)userInfo repeats:(BOOL)yesOrNo;
使用第一种方法创建的 定时器必须要手动加到NSRunloop中.第二种方法创建的会自动把timer加入MainRunloop的NSDefaultRunLoopMode中,当然也可以修改它的模式.
四, 定时器销毁(适当的时机关掉,很重要)
[timer invalidate];
timer = nil;
五, 运用
当使用NSTimer的scheduledTimerWithTimeInterval方法时。事实上此时Timer会被加入到当前线程的Run Loop中,且模式是默认的NSDefaultRunLoopMode。而如果当前线程就是主线程,也就是UI线程时,某些UI事件,比如UIScrollView的拖动操作,会将Run Loop切换成NSEventTrackingRunLoopMode模式,在这个过程中,默认的NSDefaultRunLoopMode模式中注册的事件是不会被执行的。也就是说,此时使用scheduledTimerWithTimeInterval添加到Run Loop中的Timer就不会执行。
所以为了设置一个不被UI干扰的Timer,我们需要手动创建一个Timer,然后使用NSRunLoop的addTimer:forMode:方法来把Timer按照指定模式加入到Run Loop中。这里使用的模式是:NSRunLoopCommonModes,这个模式等效于NSDefaultRunLoopMode和NSEventTrackingRunLoopMode的结合
注: 定时器会有延时的,很难做到一点不差.
感谢iOS技术牛人无私的分享,让我这个小白一天一天的成长!!!!!!!