CFRunLoopModeRef
從上一篇中我們知道:
1.
CFRunLoopModeRef
代表RunLoop
的運(yùn)行模式
2.一個(gè)RunLoop
包含若干個(gè)Mode
座菠,每個(gè)Mode
又包含若干個(gè)Source0/Source1/Timer/Observer
3.RunLoop
啟動(dòng)時(shí)只能選擇其中一個(gè)Mode
凶伙,作為currentMode
,如果需要切換Mode
,只能退出當(dāng)前Loop
,再重新選擇一個(gè)Mode
進(jìn)入
4.不同組的Source0/Source1/Timer/Observer
能分隔開(kāi)來(lái),互不影響
5.如果Mode
里沒(méi)有任何Source0/Source1/Timer/Observer
,RunLoop
會(huì)立馬退出
在程序中我們常見(jiàn)的Model有兩種:
1.
kCFRunLoopDefaultMode(NSDefaultRunLoopMode)
:App的默認(rèn)Mode
勃蜘,通常主線程是在這個(gè)Mode
下運(yùn)行。
2.UITrackingRunLoopMode
:界面跟蹤Mode
夸政,用于 ScrollView 追蹤觸摸滑動(dòng),保證界面滑動(dòng)時(shí)不受其他 Mode 影響
CFRunLoopObserverRef
CFRunLoopObserverRef
是觀察者榴徐,能夠監(jiān)聽(tīng)RunLoop的狀態(tài)改變守问。
Runloop的狀態(tài):
runloop的狀態(tài).png
添加Observer
監(jiān)聽(tīng)RunLoop
的所有狀態(tài)的方法:
監(jiān)聽(tīng)RunLoop的所有狀態(tài)
RunLoop的運(yùn)行邏輯
關(guān)于model中對(duì)象的事件功能:
Source0
- 觸摸事件處理
- performSelector:onThread:
Source1
- 基于Port的線程間通信
- 系統(tǒng)事件捕捉匀归,然后再包裝成Source0事件處理
Timers
- NSTimer定時(shí)器
- performSelector:withObject:afterDelay:(綁定線程執(zhí)行或者方法延遲執(zhí)行)
Observers
- 用于監(jiān)聽(tīng)RunLoop的狀態(tài)
- UI刷新(BeforeWaiting)
- Autorelease pool(BeforeWaiting)
runloop的處理流程:
- 通知Observers:進(jìn)入Loop
- 通知Observers:即將處理Timers
- 通知Observers:即將處理Sources
- 處理Blocks
- 處理Source0(可能會(huì)再次處理Blocks)
- 如果存在Source1,就跳轉(zhuǎn)到第8步
- 通知Observers:開(kāi)始休眠(等待消息喚醒)
- 通知Observers:結(jié)束休眠(被某個(gè)消息喚醒)
當(dāng)有這些任務(wù)中的某種過(guò)來(lái):
01> 處理Timer
02> 處理GCD Async To Main Queue
03> 處理Source1 - 處理Blocks
- 根據(jù)前面的執(zhí)行結(jié)果耗帕,決定如何操作
01>還有任務(wù) -- 回到第02步
02> 沒(méi)有任務(wù)了 --- 退出Loop - 通知Observers:退出Loop
runloop的處理流程