RunLoop

  • 運行循環(huán)

RunLoop的基本作用:

  • 保持程序的持續(xù)運行
  • 處理APP中各種事件(比如:觸摸事件,定時器事件,Selector事件等)
  • 能節(jié)省CPU資源,提高程序的性能:該做事的時候就喚醒,沒有事情就睡眠

RunLoop對象

iOS中有2套API來訪問和使用RunLoop

  • Foundation框架中的NSRunLoop;
  • Core Foundation中的CFRunLoop;

NSRunLoop是基于 CFRunLoopRef 的一層OC包裝,所以要了解RunLoop內(nèi)部結(jié)構(gòu),需要多研究CFRunLoopRef層面的API(Core Foundation層面)

RunLoop與線程
  • 每條線程都有唯一的一個與之對應(yīng)的RunLoop對象
  • 主線程中的RunLoop由系統(tǒng)自動創(chuàng)建,子線程中RunLoop可以通過手動創(chuàng)建
  • RunLoop在線程結(jié)束的時候會被銷毀
獲取RunLoop對象
  • Foundation框架中

    [NSRunLoop currentRunLoop];//獲得當(dāng)前線程的RunLoop對象
    [NSRunLoop mainRunLoop]; // 獲得主線程的RunLoop對象

  • Core Foundation框架中
    CFRunLoopGetCurrent(); // 獲得當(dāng)前線程的RunLoop對象
    CFRunLoopGetMain(); // 獲得主線程的RunLoop對象

喵~
喵~

RunLoop 內(nèi)部結(jié)構(gòu)

內(nèi)部結(jié)構(gòu)

在 RunLoop 可以在不同模式下切換,在每個 Mode 下面都會有 Source Observer Timer,分別是 接收和處理消息源,例如觸摸事件等,觀察者,監(jiān)控者執(zhí)行的活動,例如 進(jìn)入、time時間、休眠、喚醒等活動,time 主要是定時器相關(guān)的任務(wù)。

可以簡單的通過下面的這張邏輯圖了解。

RunLoop 處理邏輯

我們以一個button點擊時間為例,我們點擊后,會依次執(zhí)行,到 第五步,如果有 source 進(jìn)入那么會跳到第九步處理喚醒時接收的消息,然后跳回第二步?jīng)]有 timer 事件,就處理 source0 ,如果沒有了事件,就會進(jìn)行線程休眠。

如果有事件點擊或是 time 事件,那么線程會被再次喚醒,執(zhí)行上述的流程。

CFRunLoopSource
RunLoop的數(shù)據(jù)源抽象類(類似于OC中的protocol)

RunLoop定義了兩個版本的source:Source0 和 Source1

Source0:處理的是App內(nèi)部的事件、App自己負(fù)責(zé)管理,如按鈕點擊事件等。

Source1:由RunLoop和內(nèi)核管理,Mach Port驅(qū)動,如CFMachPort、CFMessagePort


Source有兩個版本:Source0 和 Source1。主要的差別是主動和手動的喚醒RunLoop

Source0:只包含了一個回調(diào)(函數(shù)指針),它并不能主動觸發(fā)事件。使用時,你需要先調(diào)用CFRunLoopSourceSignal(source)
,將這個 Source 標(biāo)記為待處理,然后手動調(diào)用CFRunLoopWakeUp(runloop)
來喚醒RunLoop
,讓其處理這個事件。--->加入到RunLoop
得待處理隊列中,手動喚醒RunLoop

Source1 :包含了一個 mach_port 和一個回調(diào)(函數(shù)指針),被用于通過內(nèi)核和其他線程相互發(fā)送消息。這種 Source 能主動喚醒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)容

  • 一、什么是runloop 字面意思是“消息循環(huán)、運行循環(huán)”。它不是線程,但它和線程息息相關(guān)。一般來講,一個線程一次...
    WeiHing閱讀 8,302評論 11 111
  • Run loop 剖析:Runloop 接收的輸入事件來自兩種不同的源:輸入源(intput source)和定時...
    Mitchell閱讀 12,630評論 17 111
  • 轉(zhuǎn)自http://blog.ibireme.com/2015/05/18/runloop 深入理解RunLoop ...
    飄金閱讀 1,083評論 0 4
  • 前言 最近離職了,可以盡情熬夜寫點總結(jié),不用擔(dān)心第二天上班爽并蛋疼著,這篇的主角 RunLoop 一座大山,涵蓋的...
    zerocc2014閱讀 12,538評論 13 67
  • 全職媽媽?不容易 昨個下班坐地鐵,恰巧碰見了單位一同事夫婦(男同胞為我同事),恰巧他們要去北京站接人與我一路同行,...
    兔小蟬閱讀 322評論 0 0

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