RunLoop和NSTimer1:
滑动TableView的时候我们的定时器还会生效吗?
当前线程正常请看下是运行在kCFRunLoopDefaultMode,当滑动tableview时,会发生mode的切换,切换到UITrackingRunLoopMode,此时定时器就不会再生效。
RunLoop和NSTimer2:
void CFRunLoopAddTimer(runLoop,timer,commonMode);
把NSTimer添加到当前runloop的commonMode中。
commonMode并不是实际存在的mode,它只是把一些mode打上commonMode的标记,把某个事件源同步到多个mode当中。
CommonMode的特殊性:
NSRunLoopCommonModes字符串常量来表达CommonMode。
1)CommonMode并不是实际存在的mode。
2)是同步source、timer、observer到多个mode的一个技术方案。
同一个timer、observer、source事件可以添加到多个mode上,这样保证mode切换的时候正常处理接收事件。需要借助CommonMode。
RunLoop的Mode:
当我们运行在mode1上时,只能接收处理mode1当中的source1,timers,observers.不能处理mode2、mode3里的。
![](https://img.haomeiwen.com/i13539207/eda810c8243c4991.jpg)
各个数据之间的关系:
runloop和model是一对多的关系。
mode和source,timer,observer也是一对多的关系。
![](https://img.haomeiwen.com/i13539207/7a63782462e1e6fa.jpg)
CFRunLoopObserver 2:
6个观测时间点。
1)kCFRunLoopEntry:
runloop的入口时机,当runloop启动时,系统会给我们一个回调通知。
2)kCFRunLoopBeforeTimers:
通知观察者,runloop将要对NSTimer一些相关事件进行处理。
3)kCFRunLoopBeforeSources
将要处理一些source事件。
4)kCFRunLoopBeforeWaiting
当前runloop将要进行休眠状态。即将要发生用户态到内核态的切换。
5)kCFRunLoopAfterWaiting
发生的时机是从内核态切换到用户态之后。
6)kCFRunLoopExit
runloop退出的通知。
网友评论