深入浅出 RunLoop(一):初识
深入浅出 RunLoop(二):数据结构
深入浅出 RunLoop(三):事件循环机制
深入浅出 RunLoop(四):RunLoop 与线程
深入浅出 RunLoop(五):RunLoop 与 NSTimer
深入浅出 RunLoop(六):相关面试题
RunLoop
对象的底层就是一个CFRunLoopRef
结构体,它里面存储着:
RunLoop
与线程是一一对应关系Source0
/Source1
/Timer
/Observer
RunLoop
当前的运行模式RunLoop
所有的 Mode(CFRunLoopModeRef
)模式typedef struct __CFRunLoop * CFRunLoopRef; struct __CFRunLoop { pthread_t _pthread; // 与线程一一对应 CFMutableSetRef _commonModes; CFMutableSetRef _commonModeItems; CFRunLoopModeRef _currentMode; CFMutableSetRef _modes; ... }; 复制代码
CFRunLoopModeRef
代表RunLoop
的运行模式;RunLoop
包含若干个 Mode,每个 Mode 又包含若干个Source0
/Source1
/Timer
/Observer
;RunLoop
启动时只能选择其中一个 Mode,作为 currentMode;Source0
/Source1
/Timer
/Observer
能分隔开来,互不影响;Source0
/Source1
/Timer
/Observer
,RunLoop
会立马退出。typedef struct __CFRunLoopMode *CFRunLoopModeRef; struct __CFRunLoopMode { CFStringRef _name; // mode 类型,如:NSDefaultRunLoopMode CFMutableSetRef _sources0; // CFRunLoopSourceRef CFMutableSetRef _sources1; // CFRunLoopSourceRef CFMutableArrayRef _observers; // CFRunLoopObserverRef CFMutableArrayRef _timers; // CFRunLoopTimerRef ... }; 复制代码
ModeName | 描述 |
---|---|
KCFRunLoopDefaultMode / NSDefaultRunLoopMode | 默认模式 |
UITrackingRunLoopMode | 界面追踪模式,用于 ScrollView 追踪触摸滑动,保证界面滑动时不受其他 Mode 影响; |
KCFRunLoopCommonModes / NSRunLoopCommonModes | 通用模式(默认包含 KCFRunLoopDefaultMode 和 UITrackingRunLoopMode) 该模式不是实际存在的一种模式,它只是一个特殊的标记,是同步 Source0 /Source1 /Timer /Observer 到多个 Mode 中的技术方案。被标记为通用模式的Source0 /Source1 /Timer /Observer 都会存放到 _commonModeItems 集合中,会同步这些Source0 /Source1 /Timer /Observer 到多个 Mode 中。 |
RunLoop
运行在 Mode1 下面的时候,是处理不了 Mode2 的事件的;NSDefaultRunLoopMode
默认模式和UITrackingRunLoopMode
滚动模式,滚动屏幕的时候就会切换到滚动模式,就不用去处理默认模式下的事件了,保证了 UITableView 等的滚动顺畅。