1. RunLoop理解
- RunLoop 就是線程中的一個(gè)循環(huán)柳沙,RunLoop 會(huì)在循環(huán)中會(huì)不斷檢測(cè)昔穴,通過(guò) Input sources(輸入源)和 Timer sources(定時(shí)源)兩種來(lái)源等待接受事件近尚;然后對(duì)接受到的事件通知線程進(jìn)行處理搜变,并在沒(méi)有事件的時(shí)候讓線程進(jìn)行休息艘蹋。
- RunLoop 實(shí)際上是一個(gè)對(duì)象车酣,這個(gè)對(duì)象在循環(huán)中用來(lái)處理程序運(yùn)行過(guò)程中出現(xiàn)的各種事件(比如說(shuō)觸摸事件内边、UI刷新事件榴都、定時(shí)器事件、Selector事件)漠其,從而保持程序的持續(xù)運(yùn)行嘴高。
- RunLoop 在沒(méi)有事件處理的時(shí)候竿音,會(huì)使線程進(jìn)入睡眠模式,從而節(jié)省 CPU 資源拴驮,提高程序性能春瞬。
2.RunLoop 和線程
- 一條線程對(duì)應(yīng)一個(gè)RunLoop對(duì)象,每條線程都有唯一一個(gè)與之對(duì)應(yīng)的 RunLoop 對(duì)象套啤。
- RunLoop 并不保證線程安全宽气。我們只能在當(dāng)前線程內(nèi)部操作當(dāng)前線程的 RunLoop 對(duì)象,而不能在當(dāng)前線程內(nèi)部去操作其他線程的 RunLoop 對(duì)象方法潜沦。
- RunLoop 對(duì)象在第一次獲取 RunLoop 時(shí)創(chuàng)建萄涯,銷毀則是在線程結(jié)束的時(shí)候。
- 主線程的 RunLoop 對(duì)象系統(tǒng)自動(dòng)幫助我們創(chuàng)建好了唆鸡,而子線程的 RunLoop對(duì)象需要我們主動(dòng)創(chuàng)建和維護(hù)涝影。
3. RunLoop的相關(guān)類
- CFRunLoopRef:代表 RunLoop 的對(duì)象
- CFRunLoopModeRef:代表 RunLoop 的運(yùn)行模式
- CFRunLoopSourceRef:就是 RunLoop 模型圖中提到的輸入源 / 事件源
- CFRunLoopTimerRef:就是 RunLoop 模型圖中提到的定時(shí)源
- CFRunLoopObserverRef:觀察者,能夠監(jiān)聽 RunLoop 的狀態(tài)改變
一個(gè)RunLoop對(duì)象(CFRunLoopRef)中包含若干個(gè)運(yùn)行模式(CFRunLoopModeRef)喇闸。而每一個(gè)運(yùn)行模式下又包含若干個(gè)輸入源(CFRunLoopSourceRef)、定時(shí)源(CFRunLoopTimerRef)询件、觀察者(CFRunLoopObserverRef)燃乍。
每次 RunLoop 啟動(dòng)時(shí),只能指定其中一個(gè)運(yùn)行模式(CFRunLoopModeRef)宛琅,這個(gè)運(yùn)行模式(CFRunLoopModeRef)被稱作當(dāng)前運(yùn)行模式(CurrentMode)刻蟹。
如果需要切換運(yùn)行模式(CFRunLoopModeRef),只能退出當(dāng)前 Loop嘿辟,再重新指定一個(gè)運(yùn)行模式(CFRunLoopModeRef)進(jìn)入舆瘪。
這樣做主要是為了分隔開不同組的輸入源(CFRunLoopSourceRef)、定時(shí)源(CFRunLoopTimerRef)红伦、觀察者(CFRunLoopObserverRef)英古,讓其互不影響 。
- 系統(tǒng)默認(rèn)注冊(cè)了5個(gè)Mode常用的有3個(gè):
1.kCFRynLoopDefaultMode:App的默認(rèn)Mode,通常主線程是在這個(gè)Mode下運(yùn)行
2.UITrackingRunLoopMode:界面跟蹤Mode,用于ScrollView追蹤觸摸滑動(dòng)昙读,保證界面滑動(dòng)時(shí)不受其他Mode影響
3.kCFRunLoopCommonModes:這是一個(gè)占位用的Mode召调,不是一種真正的Mode
4.UIInitializationRunLoopMode:在剛啟動(dòng)App時(shí)進(jìn)入的第一個(gè)Mode,啟動(dòng)完成后不再使用
5.GSEventReceiveRunLoopMode:接受系統(tǒng)事件的內(nèi)部Mode蛮浑,通常用不到