RunLoop

- 保證線程不退出
- 負(fù)責(zé)監(jiān)聽事件!iOS觸摸,時(shí)鐘,網(wǎng)絡(luò)
每條線程都有一個(gè)runloop,但是默認(rèn)都是不開啟的狀態(tài)


RunLoop

RunLoop 的概念

一般來講,一個(gè)線程一次只能執(zhí)行一個(gè)任務(wù),執(zhí)行完成后線程就會(huì)退出。如果我們需要一個(gè)機(jī)制,讓線程能隨時(shí)處理事件但并不退出,通常的代碼邏輯是這樣的:

functionloop(){
? ? ? initialize();
? ? ? do{
? ? ? ? ? ? varmessage=get_next_message();
? ? ? ? ? ? process_message(message);
? ? ? ?}while(message!=quit);
}

這種模型通常被稱作Event Loop。 Event Loop 在很多系統(tǒng)和框架里都有實(shí)現(xiàn),比如 Node.js 的事件處理,比如 Windows 程序的消息循環(huán),再比如 OSX/iOS 里的 RunLoop。實(shí)現(xiàn)這種模型的關(guān)鍵點(diǎn)在于:如何管理事件/消息,如何讓線程在沒有處理消息時(shí)休眠以避免資源占用、在有消息到來時(shí)立刻被喚醒。

所以,RunLoop 實(shí)際上就是一個(gè)對(duì)象,這個(gè)對(duì)象管理了其需要處理的事件和消息,并提供了一個(gè)入口函數(shù)來執(zhí)行上面 Event Loop 的邏輯。線程執(zhí)行了這個(gè)函數(shù)后,就會(huì)一直處于這個(gè)函數(shù)內(nèi)部 "接受消息->等待->處理" 的循環(huán)中,直到這個(gè)循環(huán)結(jié)束(比如傳入 quit 的消息),函數(shù)返回。

OSX/iOS 系統(tǒng)中,提供了兩個(gè)這樣的對(duì)象:NSRunLoop 和 CFRunLoopRef。

CFRunLoopRef 是在 CoreFoundation 框架內(nèi)的,它提供了純 C 函數(shù)的 API,所有這些 API 都是線程安全的。

NSRunLoop 是基于 CFRunLoopRef 的封裝,提供了面向?qū)ο蟮?API,但是這些 API 不是線程安全的。

CFRunLoopRef 的代碼是開源的,你可以在這里http://opensource.apple.com/tarballs/CF/下載到整個(gè) CoreFoundation 的源碼來查看。

(Update: Swift 開源后,蘋果又維護(hù)了一個(gè)跨平臺(tái)的 CoreFoundation 版本:https://github.com/apple/swift-corelibs-foundation/,這個(gè)版本的源碼可能和現(xiàn)有 iOS 系統(tǒng)中的實(shí)現(xiàn)略不一樣,但更容易編譯,而且已經(jīng)適配了 Linux/Windows。)


RunLoop與線程

每條線程都有唯一的一個(gè)與之對(duì)應(yīng)的RunLoop對(duì)象

主線程的RunLoop已經(jīng)自動(dòng)創(chuàng)建好了,子線程的RunLoop需要主動(dòng)創(chuàng)建

RunLoop在第一次獲取時(shí)創(chuàng)建,在線程結(jié)束時(shí)銷毀

最后編輯于
?著作權(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),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

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

  • 轉(zhuǎn)載:http://www.cocoachina.com/ios/20150601/11970.html RunL...
    Gatling閱讀 1,558評(píng)論 0 13
  • 深入理解RunLoop 由ibireme| 2015-05-18 |iOS,技術(shù) RunLoop 是 iOS 和 ...
    橙娃閱讀 967評(píng)論 1 2
  • http://www.cocoachina.com/ios/20150601/11970.html RunLoop...
    紫色冰雨閱讀 952評(píng)論 0 3
  • 原文地址:http://blog.ibireme.com/2015/05/18/runloop/ RunLoop ...
    大餅炒雞蛋閱讀 1,266評(píng)論 0 6
  • 逃脫喧囂離別人群躲入黑暗 一點(diǎn)光亮自拍 發(fā)微 刷屏 跟帖 轉(zhuǎn)載 點(diǎn)贊世界 觸手可及我選擇了孤單 (注:以上為20...
    莫遲閱讀 250評(píng)論 0 1

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