Runloop是一個對象,通過內部維護的事件循環 去管理 事件和消息;
Runloop是一些RunloopMode的集合;
常用的幾種運行模式:
kCFRunLoopDefaultMode(默認模式,主線程是在這個運行模式下運行,所以UI刷新時在該線程);
UITrackingRunLoopMode(用戶交互模式,比如拖拽,滑動等)
kCFRunLoopCommonModes(偽模式,其實是同步的在多個Mode中切換)
沒有消息時休眠,從用戶態切換到內核態;
有消息處理時,從內核態切換到用戶態;
NSRunloop是對CFRunloop進行封裝,包含五個類:
1.CFRunloop:Runloop對象;
由pthread(線程對象),currentMode(當前運行模式),modes(多個運行模式集合),commonModes(模式名稱字符串集合),commonModel(Observer,timer,source集合)組成;
2.CFRunloopMode:運行模式;
由name,source0,source1,observers,timers集合構成;
3.CFRunloopSource:輸入源/事件源;
分為source0(用戶觸發的事件,需要手動喚醒線程)和source1(基于port,包含mach_port和一個回調,監聽系統端口和內核及其他線程發送的消息,可以主動喚醒線程)兩種
4.CFRunloopTimer:定時源;
也就是NSTimer,在設定的時間點喚醒Runloop執行回調,但不一定是實時的(因為當線程處理事務繁忙時,會導致本次timer延遲甚至少執行一次);
5.CFRunloopObserver:觀察者;
監聽時間點,比如kCFRunLoopEntry(準備啟動狀態);kCFRunLoopBeforeTimers(將要處理timer事件);kCFRunLoopBeforeSources(將要處理source事件);kCFRunLoopBeforeWaiting(將要休眠,從用戶態切換到內核態);kCFRunLoopAfterWaiting(被喚醒,從內核態切換到用戶態);kCFRunLoopExit(runloop將要退出);kCFRunLoopAllActivities(監聽所有狀態)