Run Loop
运行循环
app 程序只有不停地运行, 才能不断响应用户的操作
Run Loop 两大功能:
- 睡眠中,等待消息
- 处理消息
从睡眠中 -> 处理消息, 需要一个唤醒的过程
1、 讲讲 RunLoop, 项目中有用到吗?
RunLoop 的基本作用:
保持程序的持续运行
节省 CPU 的资源,提高程序的性能 ( 没有事情,就请休眠,不要功耗。有事情,就处理)
2、 RunLoop 内部实现逻辑?
-
Core Foundation 中关于 RunLoop 的 5 个类:
CFRunLoopRef
CFRunLoopModeRef
CFRunLoopSourceRef
CFRunLoopTimerRef
CFRunLoopObserverRef
-
__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;
CFMutableSetRef _modes;
struct _block_item *_blocks_head;
struct _block_item *_blocks_tail;
CFAbsoluteTime _runTime;
CFAbsoluteTime _sleepTime;
CFTypeRef _counterpart;
};
3、 RunLoop 和线程的关系?
-
每条线程,都有唯一的一个,与之对应的 RunLoop 对象
runloops[thread] = runloop -
RunLoop 保存在一个全局的 Dictionary 里,线程作为 Key, RunLoop 作为 Value
-
线程刚创建时,并没有 RunLoop 对象, RunLoop 会在第一次获取它时,创建
-
RunLoop 会在线程结束时,销毁线程都没有了,runloop 也就没有意义了
子线程,要什么 runloop?
没有 runloop , 就是命令行,调用一次就完结
有了 runloop, 可以反复休眠、唤醒、处理消息
- 主线程的 RunLoop 已经自动获取 ( 创建 ),子线程默认没有开启 RunLoop
子线程中,获取一下 currentRunLoop, 就创建开启了 RunLoop
CFRunLoopRef CFRunLoopGetCurrent(void<