Runloop与NSTimer

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里的。



各个数据之间的关系:

runloop和model是一对多的关系。

mode和source,timer,observer也是一对多的关系。



CFRunLoopObserver 2:

6个观测时间点。

1)kCFRunLoopEntry:

runloop的入口时机,当runloop启动时,系统会给我们一个回调通知。

2)kCFRunLoopBeforeTimers:

通知观察者,runloop将要对NSTimer一些相关事件进行处理。

3)kCFRunLoopBeforeSources

将要处理一些source事件。

4)kCFRunLoopBeforeWaiting

当前runloop将要进行休眠状态。即将要发生用户态到内核态的切换。

5)kCFRunLoopAfterWaiting

发生的时机是从内核态切换到用户态之后。

6)kCFRunLoopExit

runloop退出的通知。

你可能感兴趣的:(Runloop与NSTimer)