Runloop應(yīng)用

1、什么是RunLoop?
2、main函數(shù)為什么一直不退出呢捍岳?
3、RunLoop是怎么維護的循環(huán)?

什么是RunLoop?
RunLoop是通過內(nèi)部維護的一個事件循環(huán)來對事件/消息進行管理的一個對象锣夹。
目的是:

  • 沒有消息處理時页徐,休眠以避免資源占用。同時會對線程由用戶態(tài)切換到內(nèi)核態(tài)银萍。
  • 當有消息進行處理時变勇,立即被喚醒。 會對線程通內(nèi)核態(tài)到用戶態(tài)的切換贴唇,同時線程會被喚醒搀绣。

main函數(shù)為什么能保持不退出呢?
因為在main函數(shù)啟動后戳气,在內(nèi)部會調(diào)用UIApplicationMain函數(shù)链患,在這個函數(shù)內(nèi)部實際上會啟動主線程的一個運行循環(huán)即RunLoop,RunLoop可以接受一些事件/消息瓶您,并對這些事件/消息進行處理锣险,處理完之后再繼續(xù)進行等待,這里循環(huán)不單單的是一個while循環(huán)览闰,而是用戶態(tài)和內(nèi)核態(tài)之間的相互切換芯肤。

RunLoop是怎么維護的循環(huán)?
RunLoop是CFRunLoop的封裝压鉴,提供面向?qū)ο蟮腁PI崖咨。
在RunLoop中有五大類

  • CFRunLoop
  • CFRunLoopMode
  • Source/Timer/Observer
CFRunLoop.png

其中

  • source0 事件 需要手動喚醒線程
  • source1 事件 具備喚醒線程的能力

CFRunLoopObserver
檢測時間點:

  • kCFRunLoopEntry
  • kCFRunLoopTimes
  • kCFRunLoopObservers
  • kCFRunLoopBeforeWaiting
  • kCFRunLoopAfterWaiting
  • kCFRunLoopExit

RunLoop與線程時一一對應(yīng)的關(guān)系,RunLoop與mode是一對多油吭,mode和Source/Timer/Observer是一對多


CFRunLoopMode.png

commonMode特殊性:

  • commonMode不是實際存在的一種mode
  • 是同步Source/Timer/Observer到多個Mode的一種方案击蹲。

事件循環(huán)的實現(xiàn)機制
點擊App圖標,系統(tǒng)是如何進行啟動婉宰,休眠和退出的歌豺?

RunLoop事件循環(huán)機制.jpg

  • 系統(tǒng)啟動后,會先執(zhí)行main函數(shù)
  • 在main函數(shù)內(nèi)部會調(diào)用UIApplicationMain函數(shù)心包,啟動主線程的RunLoop
  • 通知Observe將要處理Timer/Source0事件
  • 處理source0事件
  • 如果有source1事件要處理类咧,那么處理喚醒時收到的消息
  • 如果沒有事件要處理了,通知observe線程進入休眠蟹腾,等待喚醒
  • 當線程RunLoop接受到Source1痕惋,Timer事件或者外部手動喚醒,這時通過Mach-Port線程會被喚醒娃殖,從內(nèi)核態(tài)進入到用戶態(tài)值戳,處理事件
  • 當線程退出時,會通知observe退出RunLoop

RunLoop核心

RunLoop核心.jpg

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末炉爆,一起剝皮案震驚了整個濱河市堕虹,隨后出現(xiàn)的幾起案子卧晓,更是在濱河造成了極大的恐慌,老刑警劉巖赴捞,帶你破解...
    沈念sama閱讀 210,978評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件逼裆,死亡現(xiàn)場離奇詭異,居然都是意外死亡螟炫,警方通過查閱死者的電腦和手機波附,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,954評論 2 384
  • 文/潘曉璐 我一進店門艺晴,熙熙樓的掌柜王于貴愁眉苦臉地迎上來昼钻,“玉大人,你說我怎么就攤上這事封寞∪黄溃” “怎么了?”我有些...
    開封第一講書人閱讀 156,623評論 0 345
  • 文/不壞的土叔 我叫張陵狈究,是天一觀的道長碗淌。 經(jīng)常有香客問我,道長抖锥,這世上最難降的妖魔是什么亿眠? 我笑而不...
    開封第一講書人閱讀 56,324評論 1 282
  • 正文 為了忘掉前任,我火速辦了婚禮磅废,結(jié)果婚禮上纳像,老公的妹妹穿的比我還像新娘。我一直安慰自己拯勉,他們只是感情好竟趾,可當我...
    茶點故事閱讀 65,390評論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著宫峦,像睡著了一般岔帽。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上导绷,一...
    開封第一講書人閱讀 49,741評論 1 289
  • 那天犀勒,我揣著相機與錄音,去河邊找鬼妥曲。 笑死账蓉,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的逾一。 我是一名探鬼主播铸本,決...
    沈念sama閱讀 38,892評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼遵堵!你這毒婦竟也來了箱玷?” 一聲冷哼從身側(cè)響起怨规,我...
    開封第一講書人閱讀 37,655評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎锡足,沒想到半個月后波丰,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,104評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡舶得,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,451評論 2 325
  • 正文 我和宋清朗相戀三年掰烟,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片沐批。...
    茶點故事閱讀 38,569評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡纫骑,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出九孩,到底是詐尸還是另有隱情先馆,我是刑警寧澤,帶...
    沈念sama閱讀 34,254評論 4 328
  • 正文 年R本政府宣布躺彬,位于F島的核電站煤墙,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏宪拥。R本人自食惡果不足惜仿野,卻給世界環(huán)境...
    茶點故事閱讀 39,834評論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望她君。 院中可真熱鬧脚作,春花似錦、人聲如沸犁河。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,725評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽桨螺。三九已至宾符,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間灭翔,已是汗流浹背魏烫。 一陣腳步聲響...
    開封第一講書人閱讀 31,950評論 1 264
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留肝箱,地道東北人哄褒。 一個月前我還...
    沈念sama閱讀 46,260評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像煌张,于是被迫代替她去往敵國和親呐赡。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 43,446評論 2 348