【OC梳理】RunLoop了解一下

RunLoop的作用

  • 使程序一直運(yùn)行并接受用戶輸入
  • 決定程序在何時應(yīng)處理哪些Event
  • 解耦主調(diào)方(發(fā)起調(diào)用)與被調(diào)方(執(zhí)行線程),避免主調(diào)方被被調(diào)方阻塞。
  • 節(jié)省CPU資源(閑置時就不需要CPU分配資源)

OC中的RunLoop

OC中英遭,提供了兩個RunLoop的對象:NSRunLoop 和 CFRunLoopRef榨为。
CFRunLoopRef 是在 CoreFoundation 框架內(nèi)的,它提供了純 C 函數(shù)的 API品擎,所有這些 API 都是線程安全的罕拂。
NSRunLoop 是基于 CFRunLoopRef 的封裝揍异,提供了面向?qū)ο蟮?API,但是這些 API 不是線程安全的爆班。
Swift 開源后蒿秦,蘋果又維護(hù)了一個跨平臺 CoreFoundation 版本,這個版本的源碼和現(xiàn)有 iOS 系統(tǒng)中的實(shí)現(xiàn)略不一樣蛋济,但更容易編譯,而且已經(jīng)適配了 Linux/Windows炮叶。

RunLoop 與線程的關(guān)系

  • CFRunLoop 是基于 pthread 來管理的碗旅。
  • 線程和 RunLoop 之間是一一對應(yīng)的,其關(guān)系是保存在一個全局的 Dictionary 里(但并不是說一個線程里只能有一個RunLoop镜悉,因?yàn)镽unLoop中是可以嵌套RunLoop的)祟辟。
  • 線程剛創(chuàng)建時并沒有 RunLoop,如果你不主動獲取侣肄,那它一直都不會有旧困。
  • RunLoop 的創(chuàng)建是發(fā)生在第一次獲取時,RunLoop 的銷毀是發(fā)生在線程結(jié)束時稼锅。
  • 你只能在一個線程的內(nèi)部獲取其 RunLoop(主線程除外)吼具。

RunLoop與NSTimer

NSTimer實(shí)例需要在RunLoop上進(jìn)行調(diào)度才能正常運(yùn)行,NSTimer在未加入到RunLoop前矩距,并不會產(chǎn)生效果拗盒,只有當(dāng)其加入到RunLoop時(個人猜測此時會將要執(zhí)行的事件、對應(yīng)時間點(diǎn)等橋接到RunLoop的對應(yīng)屬性中)锥债,才會在RunLoop的循環(huán)中被執(zhí)行陡蝇。
更多NSTimer相關(guān)參考:
NSTimer詳解----使用、保留環(huán)問題哮肚、與runloop的關(guān)系
重新認(rèn)識NSTimer以及他與RunLoop關(guān)系

RunLoop與其他Cocoa相關(guān)

  • UIEvent事件的回調(diào)是依托在主線程的RunLoop中登夫,基本上所有UI事件的起點(diǎn)都在MainRunLoop中,這也是為什么如果在主線程中有大量耗時處理時會造成App反應(yīng)遲鈍允趟。

  • Autorelease恼策,自動釋放池中的變量會在其RunLoop的一次循環(huán)即將結(jié)束時才將池中的對象釋放。

  • 調(diào)用PerformSelecter方法時拼窥,會在內(nèi)部創(chuàng)建一個Timer并添加到對應(yīng)RunLoop中戏蔑。

  • CADisplayLink蹋凝、CATransition、CAAnimation等等與界面顯示相關(guān)的方法总棵,都與主線程的RunLoop執(zhí)行頻率有關(guān)鳍寂,RunLoop在一個循環(huán)結(jié)束前收集所有界面變化,匯總后在循環(huán)結(jié)束時調(diào)用渲染的方法進(jìn)行渲染情龄。

  • RunLoop的實(shí)現(xiàn)中使用了許多GCD相關(guān)代碼來進(jìn)行線程的調(diào)度工作迄汛,RunLoop與GCD只是協(xié)作關(guān)系,并不是對GCD的封裝骤视。

  • NSURLConnection進(jìn)行網(wǎng)絡(luò)請求時鞍爱,不論是同步還是異步,都需要用到RunLoop來等待返回值专酗。

  • 等等...

RunLoop的流程

下圖就是一個RunLoop的流程:


關(guān)于source0和source1
  • source0負(fù)責(zé)App內(nèi)部事件睹逃,由App負(fù)責(zé)管理觸發(fā),例如UIEvent祷肯、UITouch事件沉填,一般來說,App內(nèi)部的調(diào)用都屬于它的范圍佑笋。
  • source1 基于port的:包含一個 mach_port 和一個回調(diào)翼闹,可監(jiān)聽系統(tǒng)端口和通過內(nèi)核和其他線程發(fā)送的消息,能主動喚醒runloop蒋纬,一般用于接收分發(fā)系統(tǒng)事件和App間的相互通信猎荠,一些硬件事件(觸摸/鎖屏/搖晃等)也是用source1來進(jìn)行接收,然后調(diào)用_UIApplicationHandleEventQueue() 進(jìn)行應(yīng)用內(nèi)部的分發(fā)(這就變成了source0)蜀备。

什么時候使用RunLoop

  • 開啟一個常駐線程(讓一個子線程不進(jìn)入消亡狀態(tài),等待其他線程發(fā)來消息,處理其他事件)
    • 在子線程中開啟一個定時器
    • 在子線程中進(jìn)行一些長期監(jiān)控
  • 控制定時器在特定模式下執(zhí)行
  • 讓某些事件(行為关摇、任務(wù))在特定模式下執(zhí)行
  • 添加Observer監(jiān)聽RunLoop的狀態(tài),比如監(jiān)聽點(diǎn)擊事件的處理(在所有點(diǎn)擊事件之前做一些事情)

參考文章:
關(guān)于Runloop的原理探究及基本使用
深入理解RunLoop
解密——神秘的RunLoop
NSRunLoop原理詳解——不再有盲點(diǎn)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市琼掠,隨后出現(xiàn)的幾起案子拒垃,更是在濱河造成了極大的恐慌,老刑警劉巖瓷蛙,帶你破解...
    沈念sama閱讀 222,627評論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件悼瓮,死亡現(xiàn)場離奇詭異,居然都是意外死亡艰猬,警方通過查閱死者的電腦和手機(jī)横堡,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,180評論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來冠桃,“玉大人命贴,你說我怎么就攤上這事。” “怎么了胸蛛?”我有些...
    開封第一講書人閱讀 169,346評論 0 362
  • 文/不壞的土叔 我叫張陵污茵,是天一觀的道長。 經(jīng)常有香客問我葬项,道長泞当,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 60,097評論 1 300
  • 正文 為了忘掉前任民珍,我火速辦了婚禮襟士,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘嚷量。我一直安慰自己陋桂,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,100評論 6 398
  • 文/花漫 我一把揭開白布蝶溶。 她就那樣靜靜地躺著嗜历,像睡著了一般。 火紅的嫁衣襯著肌膚如雪抖所。 梳的紋絲不亂的頭發(fā)上秸脱,一...
    開封第一講書人閱讀 52,696評論 1 312
  • 那天,我揣著相機(jī)與錄音部蛇,去河邊找鬼。 笑死咐蝇,一個胖子當(dāng)著我的面吹牛涯鲁,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播有序,決...
    沈念sama閱讀 41,165評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼抹腿,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了旭寿?” 一聲冷哼從身側(cè)響起警绩,我...
    開封第一講書人閱讀 40,108評論 0 277
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎盅称,沒想到半個月后肩祥,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,646評論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡缩膝,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,709評論 3 342
  • 正文 我和宋清朗相戀三年混狠,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片疾层。...
    茶點(diǎn)故事閱讀 40,861評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡将饺,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情予弧,我是刑警寧澤刮吧,帶...
    沈念sama閱讀 36,527評論 5 351
  • 正文 年R本政府宣布,位于F島的核電站掖蛤,受9級特大地震影響杀捻,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜坠七,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,196評論 3 336
  • 文/蒙蒙 一水醋、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧彪置,春花似錦拄踪、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,698評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至潘懊,卻和暖如春姚糊,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背授舟。 一陣腳步聲響...
    開封第一講書人閱讀 33,804評論 1 274
  • 我被黑心中介騙來泰國打工救恨, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人释树。 一個月前我還...
    沈念sama閱讀 49,287評論 3 379
  • 正文 我出身青樓肠槽,卻偏偏與公主長得像,于是被迫代替她去往敵國和親奢啥。 傳聞我的和親對象是個殘疾皇子秸仙,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,860評論 2 361

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

  • 轉(zhuǎn)載:http://www.cocoachina.com/ios/20150601/11970.html RunL...
    Gatling閱讀 1,441評論 0 13
  • RunLoop 的概念 一般來講,一個線程一次只能執(zhí)行一個任務(wù)桩盲,執(zhí)行完成后線程就會退出寂纪。如果我們需要一個機(jī)制,讓線...
    Mirsiter_魏閱讀 619評論 0 2
  • 轉(zhuǎn)自http://blog.ibireme.com/2015/05/18/runloop 深入理解RunLoop ...
    飄金閱讀 990評論 0 4
  • http://www.cocoachina.com/ios/20150601/11970.html RunLoop...
    紫色冰雨閱讀 842評論 0 3
  • 文/夏夏 緣分這種東西是很微妙的赌结,冥冥之中自有注定捞蛋,你會遇到什么人,會經(jīng)歷什么事柬姚,會有什么結(jié)局襟交。 與何老板的相遇,...
    林七夏閱讀 340評論 0 2