關(guān)于RunLoop

顧名思義:運(yùn)行循環(huán),在程序運(yùn)行中循環(huán)做一些事情。
應(yīng)用范疇:定時(shí)器(Timer),performSelector,GCD Async Main Queue,事件響應(yīng),手勢(shì)識(shí)別,界面刷新,網(wǎng)絡(luò)請(qǐng)求,AutoreleasePool
基本作用:保持程序的持續(xù)運(yùn)行,處理App中的各種事件(比如觸摸事件,定時(shí)器事件等),節(jié)省CPU資源,提高程序性能(該做事時(shí)做事,該休息時(shí)休息)

執(zhí)行完第13行代碼后,程序會(huì)退出.png

程序會(huì)在需要的時(shí)候響應(yīng),不需要的時(shí)候進(jìn)行休眠.png

圖二相比圖一,這都是RunLoop的作用,說(shuō)明在UIApplicationMain的方法中已經(jīng)嵌入了RunLoop

RunLoop的偽代碼:

RunLoop代碼實(shí)現(xiàn).png

iOS中有兩套API來(lái)訪問和使用RunLoop
1.FoundationNSRunLoop;
2.Core FoundationCFRunLoopRef
兩者都表示RunLoop對(duì)象,NSRunLoop是基于CFRunLoopRef的一層OC封裝

獲取RunLoop對(duì)象:
Foundation:[NSRunLoop currentRunLoop],[NSRunLoop mainRunLoop]
Core Foundation:CFRunLoopGetCurrent(),CFRunLoopGetMain()

RunLoop相關(guān)的類(Core Foundation中關(guān)于RunLoop的五個(gè)類):
CFRunLoopRefCFRunLoopModeRef,CFRunLoopSourceRef(事件源),CFRunLoopTimerRef(計(jì)時(shí)器),CFRunLoopObserverRef

CFRunLoopRef

CFRunLoopModeRef代表運(yùn)行模式

RunLoop

source0: 指的是非基于端口por,說(shuō)白了也就是處理觸摸事件,selector事件
source1:基于端口的port,是處理系統(tǒng)的一些事件
timers:定時(shí)器,NSTimer
observers:監(jiān)聽器,監(jiān)聽RunLoop的運(yùn)行狀態(tài),可以監(jiān)聽的時(shí)間有即將進(jìn)入Loop,即將處理Timer,即將處理Source,即將進(jìn)入休眠,剛從休眠中喚醒,即將退出Loop

一個(gè)RunLoop包含若干個(gè)Mode,每個(gè)Mode又包含若干個(gè)Source0/Source1/Timer/Observer。RunLoop啟動(dòng)時(shí)只能選擇其中一個(gè)Mode,作為currentMode。如果需要切換Mode,只能退出當(dāng)前Loop,再重新選擇一個(gè)Mode進(jìn)入。不同組的Source0/Source1/Timer/Observer能分隔開來(lái),互不影響。如果Mode里沒有任何Source0/Source1/Timer/Observer,RunLoop會(huì)立馬退出。

目前已知的Mode有五種:
1.kCFRunLoopDefaultMode:App的默認(rèn)Mode,通常主線程在這個(gè)Mode下運(yùn)行
2.UITrackingRunLoopMode:界面跟蹤Mode,用于ScrollView追蹤觸摸滑動(dòng),保證界面滑動(dòng)時(shí)不受其他Mode影響
3.UIInitializationRunLoopMode:在剛啟動(dòng)App時(shí)進(jìn)入的第一個(gè)Mode,啟動(dòng)完成后不再使用
4.GSEventReceiveRunLoopMode:接收系統(tǒng)事件的內(nèi)部Mode,通常用不到
5.kCFRunLoopCommonModes:這是一個(gè)占位用的Mode,不是一種真正的Mode

RunLoop與線程:
RunLoop和線程:每條線程都有唯一的一個(gè)與之對(duì)應(yīng)的RunLoop對(duì)象,RunLoop保存在全局的字典中,線程作為key,RunLoop作為value,線程剛創(chuàng)建的時(shí)候并沒有RunLoop對(duì)象,RunLoop會(huì)在第一次獲取的時(shí)候創(chuàng)建,RunLoop會(huì)在線程結(jié)束時(shí)銷毀。

RunLoop的運(yùn)行邏輯:

RunLoop運(yùn)行邏輯

本文結(jié)束。

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

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