7-2 RunLoop的数据结构

1.CFRunLoop
2.CFRunLoopMode
3.Sourse/Timer/Observer

1.CFRunLoop

pthread ---> RunLoop和线程是一一对应的关系
currentMode --->  
modes --->  集合 NSSet< CFRunLoopMode >
commonModes --->  NSSet
cmomonModelItems. ---> Sourse/Timer/Observer 包含这些东西

2. CFRunLoopMode. runloop的模式 3种

name         ---> NSDefaultRunLoopMode
sources0 ---> 处理触摸 selector 相关事件
sources1 ---> 处理系统的一些事件
Observer
timers

3. CFRunLoopSource

sources0. 需要手动唤醒线程
sources1 具备唤醒线程的能力

4. CFRunLoopTimer

定时器。和我们平时使用的NSTimer是免费桥接转换的

5. CFRunLoopObserver

Observer 可以监测RunLoop的时间点

1. kCFRunLoopEntry  runloop的入口时机
2. kCFRunLoopBeforeTimers runloop将要对时间的一些时间进行处理了
3. kCFRunLoopBeforeTSources 将要处理Source 事件
4. kCFRunLoopBeforeWaiting 即将休眠
5. kCFRunLoopAfterWaiting 即将活跃状态
6. kCFRunLoopExit 推出的通知

6. 各个数据结构之间的关系

                                   --> Source 
RunLoop --> Model --> Timer 
                                   --> Observer 

 都是一对多的关系      

一个 CFRunLoopRef 可以有多个Mode,
每个 Mode(Mode Item) 又包含若干个  Source    Timer    Observer            

7. RunLoop的Mode

commomMode
1.关于mode:一个mode可以标记为common属性(用CFRunLoopAddCommonMode函数),然后它就会保存在_commonModes。主线程已有的两个modekCFRunLoopDefaultMode 和 UITrackingRunLoopMode 都已经是CommonModes了。
2.关于item:_commonModeItems里面存放的source, observer, timer等,在每次runLoop运行的时候都会被同步到具有Common标记的Modes里。比如这样:[[NSRunLoop currentRunLoop] addTimer:_timer forMode:NSRunLoopCommonModes];就是把timer放到commonItem里。

它是一个不存在的Mode
是同步Source Timer Observer 到 多个Mode中的一个技术方案

你可能感兴趣的:(7-2 RunLoop的数据结构)