Run Loop
运行循环
app 程序只有不停地运行, 才能不断响应用户的操作
Run Loop 两大功能:
-
睡眠中,等待消息
-
处理消息
从睡眠中 -> 处理消息, 需要一个唤醒的过程
1、 讲讲 RunLoop, 项目中有用到吗?
RunLoop 的基本作用:
保持程序的持续运行
节省 CPU 的资源,提高程序的性能 ( 没有事情,就请休眠,不要功耗。有事情,就处理)
2、 RunLoop 内部实现逻辑?
RunLoop 里面有很多种模式,他在运行的过程中,只会选择一种来运行
Modes, 就是 RunLoop 平时要做的事情
- Core Foundation 中关于 RunLoop 的 5 个类:
CFRunLoopRef
CFRunLoopModeRef
CFRunLoopSourceRef
CFRunLoopTimerRef
CFRunLoopObserverRef
CFRunLoopModeRef
-
CFRunLoopModeRef 代表 RunLoop 的运行模式
-
一个 RunLoop 包含若干个 Modes, 每个 Mode 又包含若干个 Source0 / Source1 / Timer / Observer
-
RunLoop 启动时,只能选择其中一个 Mode, 作为 currentMode
-
如果需要切换 Mode, 只能退出当前 Loop, 再重新选择一个 Mode 进入
不同组的 Source0 / Source1 / Timer / Observer 能分割开来,互不影响
- 如果 Mode 里没有任何 Source0 / Source1 / Timer / Observer , RunLoop 会立刻退出
__CFRunLoop
的数据结构
struct __CFRunLoop {
CFRuntimeBase _base;
pthread_mutex_t _lock; /* locked for accessing mode list */
__CFPort _wakeUpPort; // used for CFRunLoopWakeUp
Boolean _unused;
volatile _per_run_data *_perRunData; // reset for runs of the run loop
pthread_t _pthread;
uint32_t _winthread;
CFMutableSetRef _commonModes;
CFMutableSetRef _commonModeItems;
CFRunLoopModeRef _currentMode;
// 这里有一个集合
// 装的是一些 CFRunLoopModeRef
CFMutableSetRef _modes;
// _modes 里面有很多 mode ( CFRun