RunLoop的主要數(shù)據(jù)結(jié)構(gòu)




- CFRunLoopObserver
觀測時間點
kCFRunLoopEntry
kCFRunLoopBeforeTimers
kCFRunLoopBeforeSources
kCFRunLoopBeforeWaiting
kCFRunLoopAfterWaiting
kCFRunLoopExit


- 一個RunLoop可以有多個mode,一個mode可以有多個sources,observers,times


1.什么是RunLoop?
RunLoop是通過內(nèi)部維護的
事件循環(huán)來對事件/消息進行管理的一個對象。
事件循環(huán):
沒有消息需要處理時,休眠以避免資源占用
有消息需要處理時,立刻被喚醒

2.RunLoop可以做什么。
1.可以處理Crash (程序出現(xiàn)異常,捕獲之后,強制程序runloop)
2.保持線程存活。
3.檢測,分析,優(yōu)化卡頓問題。
3.什么是事件循環(huán)?
內(nèi)部維護的事件循環(huán)可以用來不斷的處理消息/事件,對他們進行管理,同時當沒有消息需要處理時,會從用戶態(tài)到內(nèi)核態(tài)的切換。由此可以用來進行當前線程的休眠,然后避免資源占用。
同時當有消息進行處理時,會從內(nèi)核態(tài)到用戶態(tài)的切換。然后當前的用戶線程會被喚醒。
4.main函數(shù)為什么會保持運行狀態(tài)不退出?
main函數(shù)會調(diào)用UIApplicationMain函數(shù),而在函數(shù)內(nèi)部實際上會啟動主線程的RunLoop,而RunLoop特點就是沒有消息需要處理時,會從用戶態(tài)到內(nèi)核態(tài)的切換,進行休眠。當有消息進行處理時,會從內(nèi)核態(tài)到用戶態(tài)的切換。然后當前的用戶線程會被喚醒。
5.滑動TableView的時候,我們的定時器還會生效嗎?
不會,正常情況會運行在kCFRunLoopDefaultMode模式,當滑動TableView的時候,會從kCFRunLoopDefaultMode切換到UITrackingRunLoopMode。當我們將Timer添加到一個mode上之后,如果切換到另外一個模式上,就不會響應(yīng)了。如果有多個mode的話,可以添加到NSRunLoopCommonModes上。
6.RunLoop與線程是怎樣的關(guān)系?
線程與RunLoop是一一對應(yīng)的關(guān)系。并且是以key和value健值對進行存儲的。
一個線程默認是沒有RunLoop的,我們需要為它手動創(chuàng)建。

7.如何實現(xiàn)一個常駐線程?
1.為當前線程開啟一個RunLoop。
2.向該RunLoop當中添加一個Sources或者timer等維持RunLoop的事件循環(huán)。
3.調(diào)用該RunLoop。
8.怎樣保證子線程數(shù)據(jù)回來更新UI的時候不打斷用戶的滑動操作?
滑動的時候,會運行在UITrackingRunLoopMode模式下。一般網(wǎng)絡(luò)請求會在子線程中,更新數(shù)據(jù)更新UI的時候,可以包裝起來提交到主線程的kCFRunLoopDefaultMode模式下。因為mode不一樣,所以不會打斷。
9.主線程沒有事件源(sources或者timer),子線程需要事件源(sources或者timer)才可以運行。

在網(wǎng)上看到一篇對RunLoop講述挺好的文章,在此記錄一下。
深入理解RunLoop