RunLoop是通过内部维护的事件循环来对事件/消息进行管理的一个对象。 事件循环实现:
没有消息需要处理时,休眠以避免资源占用
这时从用户态转向内核态
有消息需要处理时,立刻被唤醒
这时从内核态转向用户态
RunLoop的数据结构:
NSRunLoop是CFRunLoop的封装,提供了面向对象的API
*CFRunLoop
*CFRunLoopMode
*Source/Timer/Observer
CFRunLoop
由pthread、crrentMode、modes、commonModes、commonModeltems成员构成
CFRunLoopMode
由name、sources0、sources1、observers、timers成员组成
CFRunLoopSource
- source0 需要手动唤醒线程(使线程从内核态切换到用户态)
- source1 具备唤醒线程的能力
CFRunLoopTimer
基于事件的定时器 和NSTimer是toll-free bridge的
CFRunLoopObserver
观测时间点:
- kCFRunLoopEntry
- kCFRunLoopBeforeTimers
- kCFRunLoopBeforeSources
- kCFRunLoopBeforeWaiting(当前runLoop即将进入休眠状态,即将要从用户态到内核态的切换)
- kCFRunLoopAfterWaiting(从内核态到用户态切换的不久时间)
- kCFRunLoopExit
RunLoop可以有多个Mode,每个model结构为sources1、observers、timers
commonMode的特殊性
NSRunLoopCommonModes
- CommonMode的特殊性不是实际存在的一种Model
- 是同步Source/Timer/Observer到多个Model中一种技术方案
RunLoop处理流程:
image<figcaption></figcaption>
注意
*线程是和RunLoop一一对应的
*自己创建的线程默认是没有RunLoop的
网友评论