Runloop詳解

Runloop是一個對象,通過內部維護的事件循環 去管理 事件和消息;

Runloop是一些RunloopMode的集合;

常用的幾種運行模式:

kCFRunLoopDefaultMode(默認模式,主線程是在這個運行模式下運行,所以UI刷新時在該線程);

UITrackingRunLoopMode(用戶交互模式,比如拖拽,滑動等)

kCFRunLoopCommonModes(偽模式,其實是同步的在多個Mode中切換)

沒有消息時休眠,從用戶態切換到內核態;

有消息處理時,從內核態切換到用戶態;

NSRunloop是對CFRunloop進行封裝,包含五個類:

1.CFRunloop:Runloop對象;

由pthread(線程對象),currentMode(當前運行模式),modes(多個運行模式集合),commonModes(模式名稱字符串集合),commonModel(Observer,timer,source集合)組成;

2.CFRunloopMode:運行模式;

由name,source0,source1,observers,timers集合構成;

3.CFRunloopSource:輸入源/事件源;

分為source0(用戶觸發的事件,需要手動喚醒線程)和source1(基于port,包含mach_port和一個回調,監聽系統端口和內核及其他線程發送的消息,可以主動喚醒線程)兩種

4.CFRunloopTimer:定時源;

也就是NSTimer,在設定的時間點喚醒Runloop執行回調,但不一定是實時的(因為當線程處理事務繁忙時,會導致本次timer延遲甚至少執行一次);

5.CFRunloopObserver:觀察者;

監聽時間點,比如kCFRunLoopEntry(準備啟動狀態);kCFRunLoopBeforeTimers(將要處理timer事件);kCFRunLoopBeforeSources(將要處理source事件);kCFRunLoopBeforeWaiting(將要休眠,從用戶態切換到內核態);kCFRunLoopAfterWaiting(被喚醒,從內核態切換到用戶態);kCFRunLoopExit(runloop將要退出);kCFRunLoopAllActivities(監聽所有狀態)

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • Runloop 是和線程緊密相關的一個基礎組件,是很多線程有關功能的幕后功臣。盡管在平常使用中幾乎不太會直接用到,...
    jackyshan閱讀 9,884評論 10 75
  • 寫在前面 本文僅是自己學習RunLoop的一個記錄,參考了ibireme大神的 深入理解RunLoop[https...
    蘇東沒有坡閱讀 7,635評論 0 8
  • 不得不說,人的惰性是真可怕啊。從上周六就到寫runLoop的建議開始,星期三告訴自己從星期四開始著手寫這篇博客。然...
    老司機Wicky閱讀 7,186評論 20 137
  • 一、概念 runloop 程序在運行過程中循環的做一些事情; 二、 作用 處理下面的事件: 定時器 ...
    code_牧軒閱讀 669評論 0 0
  • 此文轉載自深入理解RunLoop,為了方便自己閱讀,發在簡書上RunLoop 是 iOS 和 OS X 開發中非常...
    漸行漸遠ty閱讀 401評論 0 0