一、什么是runloop?
runloop
是通过内部维护的事件循环来对事件/消息进行管理的对象。
-
没有事件处理时休眠,有消息需要处里时则呗唤醒
image
二、source0和source1
- source0非基于端口的,需手动唤醒线程
- source1基于端口的,具备唤醒线程的能力的
简单举个例子:一个APP在前台静止着,此时,用户用手指点击了一下APP界面,那么过程就是下面这样的:
我们触摸屏幕,先摸到硬件(屏幕),屏幕表面的事件会被IOKit先包装成Event,通过mach_Port传给正在活跃的APP , Event先告诉source1(mach_port),source1唤醒RunLoop, 然后将事件Event分发给source0,然后由source0来处理。
https://blog.csdn.net/u014600626/article/details/105146577/
三、runloop运行过程
image四、实际使用
- UITableview滑动时,延时加载大图片,保证列表滚动的流畅性
- 开启一个常驻线程(1.开启线程 2.添加一个基于端口的souce1事件 3.当前runloop跑起来)
五、线程与runloop
- 线程和runloop是一一对应的
- 自己创建的线程是没有开启runloop的
六、怎样保证子线程数据回来更新UI的时候不打断用户滑动操作?
在滑动的时候处于TrackingMode,更新主线程数据刷新设置在defaultMode下
七、autoreleasepool与runloop关系
-
第一个 Observer 监视的事件是 Entry(即将进入Loop),其回调内会调用 _objc_autoreleasePoolPush() 创建自动释放池。其 order 是-2147483647,优先级最高,保证创建释放池发生在其他所有回调之前。第二个 Observer 监视了两个事件: BeforeWaiting(准备进入休眠) 时调用_objc_autoreleasePoolPop() 和 _objc_autoreleasePoolPush() 释放旧的池并创建新池;Exit(即将退出Loop) 时调用 _objc_autoreleasePoolPop() 来释放自动释放池。这个 Observer 的 order 是 2147483647,优先级最低,保证其释放池子发生在其他所有回调之后。
-
顺序就是Entry-->push ---> BeforeWaiting--->pop-->push -->Exit-->pop,按照这样的顺便,保证了,没一次push都对应一个pop。
网友评论