RunLoop和NSTimer1:
滑動TableView的時候我們的定時器還會生效嗎?
當前線程正常請看下是運行在kCFRunLoopDefaultMode,當滑動tableview時,會發(fā)生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里的。

各個數(shù)據(jù)之間的關系:
runloop和model是一對多的關系。
mode和source,timer,observer也是一對多的關系。

CFRunLoopObserver 2:
6個觀測時間點。
1)kCFRunLoopEntry:
runloop的入口時機,當runloop啟動時,系統(tǒng)會給我們一個回調(diào)通知。
2)kCFRunLoopBeforeTimers:
通知觀察者,runloop將要對NSTimer一些相關事件進行處理。
3)kCFRunLoopBeforeSources
將要處理一些source事件。
4)kCFRunLoopBeforeWaiting
當前runloop將要進行休眠狀態(tài)。即將要發(fā)生用戶態(tài)到內(nèi)核態(tài)的切換。
5)kCFRunLoopAfterWaiting
發(fā)生的時機是從內(nèi)核態(tài)切換到用戶態(tài)之后。
6)kCFRunLoopExit
runloop退出的通知。