iOS RunLoop理解

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

RunLoop的數(shù)據(jù)結(jié)構(gòu).png
CFRunLoop的數(shù)據(jù)結(jié)構(gòu).png
CFRunLoop數(shù)據(jù)結(jié)構(gòu).png
source0和source1的區(qū)別.png
  • CFRunLoopObserver

觀測時間點
kCFRunLoopEntry
kCFRunLoopBeforeTimers
kCFRunLoopBeforeSources
kCFRunLoopBeforeWaiting
kCFRunLoopAfterWaiting
kCFRunLoopExit

image.png
image.png
  • 一個RunLoop可以有多個mode,一個mode可以有多個sources,observers,times
image.png
整個RunLoop的事件循環(huán)機制.png
1.什么是RunLoop?

RunLoop是通過內(nèi)部維護的事件循環(huán)來對事件/消息進行管理的一個對象。

事件循環(huán):
沒有消息需要處理時,休眠以避免資源占用
有消息需要處理時,立刻被喚醒
狀態(tài)切換

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)建。

image.png
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)才可以運行。
image.png

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

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

相關(guān)閱讀更多精彩內(nèi)容

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