一、Runloop是什么
Runloop是一个运行循环,本质是一个对象。内部实现是一个do while循环,保证应用程序不被退出。
二、Runloop的作用
保证程序的持续运行
处理App中的各种事件(block、timer、source0、source1、GCD主队列、oberver)
节约cpu资源,保证程序的性能:该做事就做事,该休息就休息
三、Runloop和线程的关系
线程和runloop是通过key-value的形式一一对应的关系
注意一点:子线程runloop默认不开启
四、Runloop对象和mode
model:是runloop里面的模式,不同的模式下的runloop处理的事件和消息有一定的差别。
系统默认注册了5个Mode:
(1)kCFRunLoopDefaultMode: App的默认 Mode,通常主线程是在这个 Mode 下运行的。
(2)UITrackingRunLoopMode: 界面跟踪 Mode,用于 ScrollView 追踪触摸滑动,保证界面滑动时不受其他 Mode 影响。
(3)UIInitializationRunLoopMode: 在刚启动 App 时第进入的第一个 Mode,启动完成后就不再使用。
(4)GSEventReceiveRunLoopMode: 接受系统事件的内部 Mode,通常用不到。
(5)kCFRunLoopCommonModes: 这是一个占位的 Mode,没有实际作用。
五、RunloopSource、Observer、timer
timer、obsever、source加入到runloop相应mode的items中执行。
1.timer加入的mode和现在runloop的mode相等,则执行。或者, timer加入的mode与COmmonMode相等也可以执行。
2.observer监听runloop的状态,没有用的时候就休眠。
3.source分source0和source1
(1)响应事件source0:处理App内部事件以及App内部管理的事件,比如UIEvent和CFSocket
signal待处理
wakeup唤醒runloop处理事件
(2)source1:线程与线程之间的通信。source1通过port进行线程之间的通讯。
网友评论