概念
- RunLoop類似于Windows程序的消息循壞,不斷的循環(huán)處理事件消息(定時器事件,用戶交互事件,模態(tài)窗口事件,系統(tǒng)Source事件,自定義Source事件)
- RunLoop和線程是一一對應(yīng)的,直到在線程中獲取的時候,RunLoop才創(chuàng)建
- RunLoop包括3大核心組建:定時器,輸入源Input Sources和觀察者Observer
RunLoop的Modes
- Modes是一組事件類型的集合,每個事件是注冊關(guān)聯(lián)到一個或者多個Mode中,RunLoop在每個時刻運行在一個特定的模式
- RunLoop在運行時,只注冊到當前模式下的事件和通知模式相關(guān)的觀察者
- NSDefaultRunLoopMode
- NSRunLoopCommonModes
- TrackingRunLoopMode
Observer
* CFRunLoopActivity定義了RunLoop在運行中不同的活動狀態(tài),這些狀態(tài)可以通過觀察者Observer跟蹤
/* Run Loop Observer Activities */
typedef CF_OPTIONS(CFOptionFlags, CFRunLoopActivity) {
kCFRunLoopEntry = (1UL << 0),
kCFRunLoopBeforeTimers = (1UL << 1),
kCFRunLoopBeforeSources = (1UL << 2),
kCFRunLoopBeforeWaiting = (1UL << 5),
kCFRunLoopAfterWaiting = (1UL << 6),
kCFRunLoopExit = (1UL << 7),
kCFRunLoopAllActivities = 0x0FFFFFFFU
};
定時器
- 當其加入到 RunLoop 時,RunLoop會注冊對應(yīng)的時間點,當時間點到時,RunLoop會被喚醒以執(zhí)行那個回調(diào)
Input Source
- 基于Port的Source
- Perform Selector Sources
- 自定義Source
RunLoop事件處理流程
RunLoop事件處理流程
- 通知觀察者即將進入runloop處理
- 如果存在即將發(fā)生的定時器事件,通知所有的觀察者。
- 如果存在即將發(fā)生的非port的source事件,在事件發(fā)生前,通知所有的觀察者。
- 如果存在即將發(fā)生的非port的source事件,在事件發(fā)生后,通知所有的觀察者。
- 如果存在基于port的事件等待處理,立即處理轉(zhuǎn)9
- 通知觀察者,線程即將休眠
- 線程休眠一直等到下面任意事件之一發(fā)生:
- 基于port的事件發(fā)生
- 定時器超時
- runloop設(shè)置的超時時間到期
- 顯式的喚醒runloop
- 通知觀察者,線程即將被喚醒
- 處理等待的事件
- 如果是定時器事件,執(zhí)行定時器處理函數(shù)重新start runloop, 轉(zhuǎn)2
- 如果是用戶定義的source 執(zhí)行對應(yīng)的事件處理方法
- 如果runloop被顯式的喚醒并且沒有超時,重新start runloop, 轉(zhuǎn)2
RunLoop的使用
- AutoreleasePool
- 事件響應(yīng)
- 手勢識別
- 界面更新
- 定時器
- PerformSelector