1. runloop是什么?
a. Runloop是事件接收和分发机制的一个实现。
b. 一个runloop就是一个事件处理循环,用来不停的调配工作以及处理输入事件。
c. runloops是线程的基础架构部分。使用run loop的目的是使你的线程在有工作的时候工作,没有的时候休眠。
d. 在任何情况,Runloop都不需要手动创建(alloc),如果需要获取当前线程中的runloop,只需要currentRunLoop即可。
e. 在主线程中,系统默认创建并且启动主线程runloop。
但是在分线程中,系统不会默认启动runloop,需要手动启动。
f. 主线程中的runloop,默认mode是default
简单来说:Runloop是事件循环处理机制。有事情的时候就去做,没事就休眠。
2. runloop的mode有什么用?
a. 主线程runloop默认是default,runloop还有NSRunLoopCommonModes,UITrackingRunLoopMode等模式。
NSRunLoopCommonModes:一组配置模式。
UITrackingRunLoopMode: 滚动视图滚动的模式。
b. 情况1:当tableView\CollectionView\ScrollView滑动的时候为什么NSTimer停止?
原因:当滚动视图滚动的时候,当前runloop处于UITrackingRunLoopMode。一个runloop不能同时共存在于2个模式。当前runloop处理滚动视图的事件。
修改timer在runloop中的模式与滚动视图在runloop中的模式一致为:UITrackingRunLoopMode。
代码:
[[NSRunLoopcurrentRunLoop] addTimer: timer forMode:UITrackingRunLoopMode];
3. 如果NSTimer在分线程中创建应该注意
a. 子线程中runloop不会启动
[NSTimerscheduledTimerWithTimeInterval:1target:selfselector:@selector(update)userInfo:nilrepeats:YES];
需要启动分线程中的runloop
[[NSRunLoopcurrentRunLoop]run];