Runloop與NSTimer

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退出的通知。

最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

友情鏈接更多精彩內(nèi)容