1、runloop是什么?
runloop是事件接收和分发机制的一种实现。
runloop是线程的基础组成部分,一个runloop就是一个事件处理循环,用来不断的处理输入事件和调配工作,使用runloop的目的是为了让线程在有工作的时候工作,没有工作的时候休眠,从而节约资源。runloop单从其工作内容来看和快递的中转站有很大的相似之处。
2、runloop和线程的关系
runloop是线程的基础组成部分,每个线程都默认拥有一个runloop对象,但是只有主线程的runloop对象是默认就存在且默认是打开的,其他线程的runloop对象只有在第一次获取runloop对象时才会创建而且默认是关闭状态,需要我们手动调用run方法运行。
3、timer和runloop之间的渊源
我们创建timer时,之所以timer能运行,是因为创建timer时,一般情况下,是在主线程中创建,这时会默认将timer以defaultRunloopModel的类型加入主线程,而主线程的runloop对象默认是打开的,从而timer可以运行。
4、为什么我们在滑动屏幕上的scrollerView和tableview的timer会停止运行?
一个runloop对象包含多个model,每个model又拥有各自的source/timer/observer,每次调用runloop时只能指定一个model,如果想要切换model,必须先退出runloop,然后重新指定一种model进入,而timer之所以会停止运行,就是因为timer是注册在defaultRunloopModel类型上的,当屏幕滑动时,线程默认会将model切换到trackingRunloopModel,当停止滑动时,又会切换回defaultModel。(当用户正在滑动 UIScrollView 时,RunLoop 将切换到UITrackingRunLoopMode接受滑动手势和处理滑动事件(包括减速和弹簧效果),此时,其他 Mode (除 NSRunLoopCommonModes 这个组合 Mode)下的事件将全部暂停执行,来保证滑动事件的优先处理,这也是 iOS 滑动顺畅的重要原因)
5、怎样滑动屏幕上的scrollerView和tableview的timer停止问题
方法1:创建一条新的线程,然后将timer加入到新创建线程对应的runloop对象中即可。
方法2:依旧是将timer注册在主线程的runloop中,不过注册的model类型为commonModels,之所以加入到commonModels中就行,是因为commonModels是一种公用的类型,每当runloop内容发生改变时,runloop会将commonModels类型下所有注册的内容同步到对应的model中。