iOS Runloop

簡介(摘自官方文檔

Run loops are part of the fundamental infrastructure associated with threads. A run loop is an event processing loop that you use to schedule work and coordinate the receipt of incoming events. The purpose of a run loop is to keep your thread busy when there is work to do and put your thread to sleep when there is none.

Run loop management is not entirely automatic. You must still design your thread’s code to start the run loop at appropriate times and respond to incoming events. Both Cocoa and Core Foundation provide run loop objects to help you configure and manage your thread’s run loop. Your application does not need to create these objects explicitly; each thread, including the application’s main thread, has an associated run loop object. Only secondary threads need to run their run loop explicitly, however. The app frameworks automatically set up and run the run loop on the main thread as part of the application startup process.

簡單翻譯一下:
運行循環(huán)是與線程相關的基本基礎設施的一部分赊豌,運行循環(huán)是一個用于調度工作并協(xié)調傳入事件的接收的事件處理循環(huán)宁舰。運行循環(huán)作用就是在有工作要做的時候保持線程busy狀態(tài)卢肃,否則讓線程sleep丹莲。
運行循環(huán)管理并非完全自動化。仍然必須手動設計線程的相關代碼姆涩,以便在適當?shù)臅r候啟動運行循環(huán)并響應傳入事件。Cocoa和Core Foundation都提供運行循環(huán)對象以幫助您配置和管理線程的運行。您的應用程序不需要顯式創(chuàng)建這些對象剥槐;每個線程(包括應用程序的主線程)都有相關的運行循環(huán)對象。子級線程需要代碼啟動它們的運行循環(huán)宪摧。應用程序框架自動設置并運行主線程的運行循環(huán)作為應用程序啟動過程的一部分粒竖。ps:謝謝百度翻譯,祝愿越來越牛逼几于。

簡單剖析

運行循環(huán)就像它的名字一樣循環(huán)運行蕊苗,你的線程可以使用它驅動事件處理程序以響應傳入事件。您的代碼提供了用于執(zhí)行循環(huán)的實際循環(huán)部分的控制語句沿彭,換句話說朽砰,您的代碼提供了驅動循環(huán)的while循環(huán)或for循環(huán)。在你的循環(huán)中喉刘,你使用一個運行循環(huán)對象來“運行”事件處理代碼(這個代碼用于接收事件并調用已安裝的處理程序)瞧柔。
運行循環(huán)接收來自兩種不同類型源的事件。輸入源提供異步事件睦裳,通常是來自另一個線程或來自不同應用程序的消息造锅。定時器源提供同步事件,發(fā)生在預定時間或重復間隔廉邑。這兩種類型的源使用特定于應用程序的處理器例程來處理事件到達時备绽。

下圖顯示了運行循環(huán)和各種資源的概念結構:


Run Loop Modes

運行循環(huán)模式是一個input sources (被監(jiān)聽)和 timers sources (被監(jiān)聽)的集合,以及運行循環(huán)觀察員(被通知)的集合鬓催。每次運行運行循環(huán)時肺素,都要指定運行的特定“模式”(無論是顯式的還是隱式的)。在運行循環(huán)的運行的過程中宇驾,只監(jiān)視與該運行模式相關的事件源倍靡,并允許事件源傳遞事件。(類似地课舍,只有與該模式相關聯(lián)的觀察者被通知運行循環(huán)的進度)塌西。與其他模式相關聯(lián)的輸入源保留住任何新事件直到在適當模式。

模式如下:


NSDefaultRunLoopMode: 大多數(shù)操作的運行循環(huán)模式筝尾,很多時候你應該使用這種模式運行runloop捡需。
NSModalPanelRunLoopMode:cocoa使用此模式識別用于模態(tài)面板的事件。
NSEventTrackingRunLoopMode:cocoa在鼠標拖動循環(huán)和其他類型的用戶界面跟蹤循環(huán)中使用此模式限制傳入事件(我們也可以把事件源加入到這種模式)筹淫。
NSRunLoopCommonModes:這是一個復合模式站辉。

小實例

  // 1.創(chuàng)建NSTimer  
  NSTimer *timer = [NSTimer timerWithTimeInterval:2.0 target:self selector:@selector(show) userInfo:nil repeats:YES];  

  // 2.1.添加到當前的runloop中(主運行循環(huán))
  // 把定時器加入到默認 NSDefaultRunLoopMode 模式 。
  // 拖拽界面,runloop會自動進入UITrackingMode饰剥,此時定時器停止工作殊霞。
  [[NSRunLoop currentRunLoop] addTimer:timer forMode:NSDefaultRunLoopMode];  

  // 2.2.添加到當前的runloop中(主運行循環(huán))  
  // 把定時器加入到UITrackingRunLoopMode模式
  // 拖拽界面,runloop進入到UITrackingRunLoopMode模式汰蓉,定時器工作绷蹲。 
  [[NSRunLoop currentRunLoop] addTimer:timer forMode:UITrackingRunLoopMode];  

  // 2.3.添加到當前的runloop中(主運行循環(huán) )
  // 把定時器加入到NSRunLoopCommonModes模式(復合模式)
  // 拖拽界面,runloop進入到UITrackingRunLoopMode模式顾孽,定時器工作不受影響祝钢。   
    [[NSRunLoop currentRunLoop] addTimer:timer forMode:NSRunLoopCommonModes]; 

   > 總結:主運行循環(huán)運行在什么mode下運行不是由代碼決定的;當一個運行循環(huán)切換到某種模式時若厚,就可以監(jiān)聽相應模式下的輸入源和通知相應模式下的觀察者了拦英,停止監(jiān)聽和通知切出模式下輸入源和觀察者。

  ```
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末盹沈,一起剝皮案震驚了整個濱河市龄章,隨后出現(xiàn)的幾起案子吃谣,更是在濱河造成了極大的恐慌乞封,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,039評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件岗憋,死亡現(xiàn)場離奇詭異肃晚,居然都是意外死亡,警方通過查閱死者的電腦和手機仔戈,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,426評論 3 395
  • 文/潘曉璐 我一進店門关串,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人监徘,你說我怎么就攤上這事晋修。” “怎么了凰盔?”我有些...
    開封第一講書人閱讀 165,417評論 0 356
  • 文/不壞的土叔 我叫張陵墓卦,是天一觀的道長。 經常有香客問我户敬,道長落剪,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,868評論 1 295
  • 正文 為了忘掉前任尿庐,我火速辦了婚禮忠怖,結果婚禮上,老公的妹妹穿的比我還像新娘抄瑟。我一直安慰自己凡泣,他們只是感情好,可當我...
    茶點故事閱讀 67,892評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著问麸,像睡著了一般往衷。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上严卖,一...
    開封第一講書人閱讀 51,692評論 1 305
  • 那天席舍,我揣著相機與錄音,去河邊找鬼哮笆。 笑死来颤,一個胖子當著我的面吹牛,可吹牛的內容都是我干的稠肘。 我是一名探鬼主播福铅,決...
    沈念sama閱讀 40,416評論 3 419
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼项阴!你這毒婦竟也來了滑黔?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 39,326評論 0 276
  • 序言:老撾萬榮一對情侶失蹤环揽,失蹤者是張志新(化名)和其女友劉穎略荡,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體歉胶,經...
    沈念sama閱讀 45,782評論 1 316
  • 正文 獨居荒郊野嶺守林人離奇死亡汛兜,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,957評論 3 337
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了通今。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片粥谬。...
    茶點故事閱讀 40,102評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖辫塌,靈堂內的尸體忽然破棺而出漏策,到底是詐尸還是另有隱情,我是刑警寧澤臼氨,帶...
    沈念sama閱讀 35,790評論 5 346
  • 正文 年R本政府宣布掺喻,位于F島的核電站,受9級特大地震影響一也,放射性物質發(fā)生泄漏巢寡。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,442評論 3 331
  • 文/蒙蒙 一椰苟、第九天 我趴在偏房一處隱蔽的房頂上張望抑月。 院中可真熱鬧,春花似錦舆蝴、人聲如沸谦絮。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,996評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽层皱。三九已至性锭,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間叫胖,已是汗流浹背草冈。 一陣腳步聲響...
    開封第一講書人閱讀 33,113評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留瓮增,地道東北人怎棱。 一個月前我還...
    沈念sama閱讀 48,332評論 3 373
  • 正文 我出身青樓,卻偏偏與公主長得像绷跑,于是被迫代替她去往敵國和親拳恋。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,044評論 2 355

推薦閱讀更多精彩內容