iOS RunLoop

RunLoop

1、概念

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

2姨伤、事件循環(huán):

  • 沒有消息需要處理時,休眠以避免資源占用

  • 有消息需要處理時贩幻,立刻被喚醒

事件循環(huán)
RunLoop

3轿腺、數(shù)據(jù)結(jié)構(gòu)

NSRunLoop是不開源的两嘴,CFRunLoop是開源的

數(shù)據(jù)結(jié)構(gòu)
  • CFRunLoop
CFRunLoop
  • CFRunLoopMode
CFRunLoopMode
  • CFRunLoopSource

    • APP運行的過程其實就是處理各種事件的過程,那么族壳,如果讓大家把事件進(jìn)行分類憔辫,大家會分成幾類?分類的方式有很多仿荆,但一定會有下面這幾種:
      系統(tǒng)層事件贰您、應(yīng)用層事件、特殊事件拢操。(這只是為了大家理解source1和source0舉得一個不嚴(yán)謹(jǐn)?shù)睦咏跻啵蠹也灰谝饧?xì)節(jié))

    • source0基本就是應(yīng)用層事件,其中source1基本就是系統(tǒng)事件令境。復(fù)雜點說:

    • Source0 :非基于Port的 處理事件杠园,什么叫非基于Port的呢?就是說你這個消息不是其他進(jìn)程或者內(nèi)核直接發(fā)送給你的舔庶。(performSelector:onThread:)

    • Source1 :基于mach_Port的,來自系統(tǒng)內(nèi)核或者其他進(jìn)程或線程的事件抛蚁,可以主動喚醒休眠中的RunLoop(iOS里進(jìn)程間通信開發(fā)過程中我們一般不主動使用)。mach_port大家就理解成進(jìn)程間相互發(fā)送消息的一種機制就好惕橙。(基于Port的線程間通信瞧甩、系統(tǒng)事件捕捉)

    • 簡單舉個例子:一個APP在前臺靜止著,此時弥鹦,用戶用手指點擊了一下APP界面肚逸,那么過程就是下面這樣的:
      我們觸摸屏幕,先摸到硬件(屏幕),屏幕表面的事件會先包裝成Event, Event先告訴source1(mach_port),source1喚醒RunLoop, 然后將事件Event分發(fā)給source0,然后由source0來處理惶凝。


      CFRunLoopSource
  • CFRunLoopTimer

CFRunLoopTimer
  • CFRunLoopObserver

    可以觀測6個時間點

    • kCFRunLoopEntry 進(jìn)入RunLoop

    • kCFRunLoopBeforeTimers 即將處理Timers一些事件

    • kCFRunLoopBeforeSources 即將處理Sources一些事件

    • kCFRunLoopBeforeWaiting 即將進(jìn)入休眠 即將從用戶態(tài)->內(nèi)核態(tài)切換

    • kCFRunLoopAfterWaiting 內(nèi)核態(tài)->用戶態(tài)切換后的不久

    • kCFRunLoopExit RunLoop退出

數(shù)據(jù)關(guān)系

4吼虎、RunLoop的Mode

  • 如果運行在一個Mode上犬钢,只能接受當(dāng)前Mode的事件苍鲜,其他Mode不會運行
多Mode
  • CommonMode的特殊性
CommonMode

5、事件循環(huán)的實現(xiàn)機制

  • 啟動會調(diào)用CFRunLoopRun( )方法
實現(xiàn)機制

??:main函數(shù)調(diào)用后會調(diào)用UIApplicationMain方法玷犹,方法內(nèi)部會啟動主線程的RunLoop混滔,經(jīng)過一系列處理,主線程的RunLoop處于休眠狀態(tài)歹颓,此時點擊一下屏幕會產(chǎn)生一個mach-port坯屿,會轉(zhuǎn)換成一個Source1,喚醒主線程巍扛,然后運行處理领跛,當(dāng)程序被殺死就會退出RunLoop,線程被殺死撤奸。

6吠昭、RunLoop的核心

RunLoop的核心

7喊括、RunLoop與NSTimer

RunLoop與NSTimer
  • void CFRunLoopAddTimer(runLoop, timer, commonMode)
CFRunLoopAddTimer
  • void __CFRunLoopAddItemToCommonModes(const void *value, void *ctx)
CFRunLoopAddItemToCommonModes

8、RunLoop與多線程

RunLoop與多線程
  • 常駐線程

獲取當(dāng)前線程的RunLoop矢棚,如果當(dāng)前線程沒有RunLoop會自動創(chuàng)建一個

[NSRunLoop currentRunLoop];
image-20211006121545588
  • 創(chuàng)建一個常駐線程
常駐線程
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末郑什,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子蒲肋,更是在濱河造成了極大的恐慌蘑拯,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,635評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件兜粘,死亡現(xiàn)場離奇詭異申窘,居然都是意外死亡,警方通過查閱死者的電腦和手機妹沙,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,543評論 3 399
  • 文/潘曉璐 我一進(jìn)店門偶洋,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人距糖,你說我怎么就攤上這事玄窝。” “怎么了悍引?”我有些...
    開封第一講書人閱讀 168,083評論 0 360
  • 文/不壞的土叔 我叫張陵恩脂,是天一觀的道長。 經(jīng)常有香客問我趣斤,道長俩块,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,640評論 1 296
  • 正文 為了忘掉前任浓领,我火速辦了婚禮玉凯,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘联贩。我一直安慰自己漫仆,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 68,640評論 6 397
  • 文/花漫 我一把揭開白布泪幌。 她就那樣靜靜地躺著盲厌,像睡著了一般。 火紅的嫁衣襯著肌膚如雪祸泪。 梳的紋絲不亂的頭發(fā)上吗浩,一...
    開封第一講書人閱讀 52,262評論 1 308
  • 那天,我揣著相機與錄音没隘,去河邊找鬼懂扼。 笑死,一個胖子當(dāng)著我的面吹牛右蒲,可吹牛的內(nèi)容都是我干的阀湿。 我是一名探鬼主播屡限,決...
    沈念sama閱讀 40,833評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼炕倘!你這毒婦竟也來了钧大?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,736評論 0 276
  • 序言:老撾萬榮一對情侶失蹤罩旋,失蹤者是張志新(化名)和其女友劉穎啊央,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體涨醋,經(jīng)...
    沈念sama閱讀 46,280評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡瓜饥,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,369評論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了浴骂。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片乓土。...
    茶點故事閱讀 40,503評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖溯警,靈堂內(nèi)的尸體忽然破棺而出趣苏,到底是詐尸還是另有隱情,我是刑警寧澤梯轻,帶...
    沈念sama閱讀 36,185評論 5 350
  • 正文 年R本政府宣布食磕,位于F島的核電站,受9級特大地震影響喳挑,放射性物質(zhì)發(fā)生泄漏彬伦。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,870評論 3 333
  • 文/蒙蒙 一伊诵、第九天 我趴在偏房一處隱蔽的房頂上張望单绑。 院中可真熱鬧,春花似錦曹宴、人聲如沸搂橙。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,340評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽份氧。三九已至唯袄,卻和暖如春弯屈,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背恋拷。 一陣腳步聲響...
    開封第一講書人閱讀 33,460評論 1 272
  • 我被黑心中介騙來泰國打工资厉, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人蔬顾。 一個月前我還...
    沈念sama閱讀 48,909評論 3 376
  • 正文 我出身青樓宴偿,卻偏偏與公主長得像湘捎,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子窄刘,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,512評論 2 359

推薦閱讀更多精彩內(nèi)容

  • 前言 對iOS開發(fā)者而言窥妇,runloop是一個老生常談的話題,但凡是iOS開發(fā)者娩践,在工作中必然直接或間接的接觸過r...
    VV木公子閱讀 2,982評論 4 21
  • Runloop 是和線程緊密相關(guān)的一個基礎(chǔ)組件活翩,是很多線程有關(guān)功能的幕后功臣。盡管在平常使用中幾乎不太會直接用到翻伺,...
    jackyshan閱讀 9,862評論 10 75
  • 一材泄、邂逅runLoop 應(yīng)該是一個美麗的下午,在一場面試上吨岭,遇見了runLoop拉宗,可惜擦肩而過。辣辫。旦事。 二、認(rèn)識ru...
    AlvinCrash閱讀 368評論 0 0
  • runloop概念 Run loops are part of the fundamental infrastru...
    liangxiuchen閱讀 173評論 0 0
  • 前言 最近離職了,可以盡情熬夜寫點總結(jié)急灭,不用擔(dān)心第二天上班爽并蛋疼著族檬,這篇的主角 RunLoop 一座大山,涵蓋的...
    zerocc2014閱讀 12,378評論 13 67