了解runloop(一)

本文是拜讀 http://blog.ibireme.com/2015/05/18/runloop/ 后的一些個(gè)人見解. 想更加深入地了解請(qǐng)猛戳上面的鏈接.

RunLoop,翻譯過(guò)來(lái),就是一個(gè)不斷循環(huán)的閉環(huán).這個(gè)閉環(huán)不斷地處理任務(wù). 具體流程是處理任務(wù)-休眠-被喚醒處理任務(wù).正如餐廳服務(wù)員可以響應(yīng)客人的需求,在客人不需要服務(wù)的時(shí)候在門外守候,直到再次被召喚.

事實(shí)上,RunLoop就是一個(gè)對(duì)象,這個(gè)對(duì)象管理了其需要處理的事件和消息,并提供了一個(gè)入口函數(shù)來(lái)執(zhí)行一個(gè)doWhile函數(shù),不斷處理任務(wù).線程執(zhí)行了這個(gè)函數(shù)后,就會(huì)一直處于這個(gè)函數(shù)內(nèi)部 "接受消息->等待->處理" 的循環(huán)中,直到這個(gè)循環(huán)結(jié)束(比如傳入 quit 的消息),函數(shù)返回.還是舉餐廳的例子,一旦客人進(jìn)來(lái)餐廳,餐廳就要負(fù)責(zé)調(diào)配服務(wù)員處理客人的要求,直到客人用餐完畢離開.

我們什么時(shí)候會(huì)需要用到RunLoop呢?
在回答這個(gè)問(wèn)題之前,我們得知道更多的信息,其實(shí),每一個(gè)線程都是對(duì)應(yīng)一個(gè)RunLoop的,但是除了主線程的RunLoop,其他RunLoop默認(rèn)是不開啟的.只有我們主動(dòng)獲取他的時(shí)候,才會(huì)開啟.

要了解RunLoop,我們必須知道兩個(gè)對(duì)象:
1,CFRunLoopRef是在Core Foundation里面的,它是一套純C的API,是線程安全的.
2,NSRunLoop則是對(duì)CFRunLoopRef的封裝,它是面對(duì)對(duì)象的API,不是線程安全的.

由于NSRunLoop并不是開源的,我們只能通過(guò)CFRunLoopRef來(lái)研究.通過(guò)http://opensource.apple.com/tarballs/CF/CF-855.17.tar.gz](http://opensource.apple.com/tarballs/CF/CF-855.17.tar.gz可以下載源代碼.

RunLoop 與線程的關(guān)系
首先,iOS 開發(fā)中能遇到兩個(gè)線程對(duì)象: pthread_t 和 NSThread。過(guò)去蘋果有份文檔標(biāo)明了 NSThread 只是 pthread_t 的封裝,但那份文檔已經(jīng)失效了,現(xiàn)在它們也有可能都是直接包裝自最底層的 mach thread。蘋果并沒有提供這兩個(gè)對(duì)象相互轉(zhuǎn)換的接口,但不管怎么樣,可以肯定的是 pthread_t 和 NSThread 是一一對(duì)應(yīng)的。比如,你可以通過(guò) pthread_main_np() 或 [NSThread mainThread] 來(lái)獲取主線程;也可以通過(guò) pthread_self() 或 [NSThread currentThread] 來(lái)獲取當(dāng)前線程。CFRunLoop 是基于 pthread 來(lái)管理的。

蘋果不允許直接創(chuàng)建 RunLoop,它只提供了兩個(gè)自動(dòng)獲取的函數(shù):CFRunLoopGetMain() 和 CFRunLoopGetCurrent()。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 轉(zhuǎn)載:http://www.cocoachina.com/ios/20150601/11970.html RunL...
    Gatling閱讀 1,556評(píng)論 0 13
  • RunLoop的概念 一般來(lái)講,一個(gè)線程一次只能執(zhí)行一個(gè)任務(wù),執(zhí)行完成后線程就會(huì)退出。如果我們需要一個(gè)機(jī)制,讓線程...
    IOS學(xué)渣閱讀 498評(píng)論 1 4
  • Runloop是iOS和OSX開發(fā)中非?;A(chǔ)的一個(gè)概念,從概念開始學(xué)習(xí)。 RunLoop的概念 -般說(shuō),一個(gè)線程一...
    小貓仔閱讀 1,106評(píng)論 0 1
  • 文章轉(zhuǎn)載自:ibireme 博客博客地址:https://blog.ibireme.com/2015/05/18/...
    flyrees閱讀 293評(píng)論 0 0
  • 有人等在旅游階段 風(fēng)景感受比鄰無(wú)界限 有人等在咖啡館 同樣的位置 同樣的咖啡 音樂播放不階段 這樣的習(xí)慣 在咖啡館...
    汐的島閱讀 179評(píng)論 2 1

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