聊聊 iOS 中的 RunLoop 考題 (中文版)

Run (跑) Loop (圈)

Run Loop 是與進程相關(guān)的基礎(chǔ)設(shè)施欢伏。Run Loop 是來協(xié)調(diào)待接受的事件、安排調(diào)度的亿乳,事件處理循環(huán)硝拧。Run Loop 的作用就是径筏,有任務(wù),開起進程障陶,沒任務(wù)滋恬,休眠進程。

翻譯自蘋果的 runloop 文檔


上一段代碼 抱究,與 NSRunLoop 和 NSThread 相關(guān)恢氯,

NSThread* th=[[NSThread alloc] initWithTarget:self selector:@selector(someMethod) object:nil];
[th start];

-(void) someMethod
{
    NSLog(@"operation");
}


Run Loop 是處理 sockets 網(wǎng)絡(luò), ports 端口, files 文件 , keyboard 鍵盤 , mouse 鼠標(biāo) , timers 計時器 的機制的一層抽象。

NSThread 都有著專屬的 Run Loop 鼓寺,可以通過 currentRunLoop 方法訪問勋拟。

一般是不需要直接訪問 Run Loop 的÷韬颍可以用網(wǎng)絡(luò)相關(guān)的組件指定Run Loop 敢靡, 處理 IO 輸入輸出。

等著輸入源有數(shù)據(jù) / 事件苦银,給定線程的 Run Loop 就會讓合適的輸入處理函數(shù)處理有數(shù)據(jù) / 事件啸胧,等待執(zhí)行的輸入源。

執(zhí)行完后幔虏,Run Loop 會還原纺念。如果有其他輸入源的數(shù)據(jù) / 事件, 該線程的 Run Loop 會處理想括;如果無陷谱, 該線程會進入休眠狀態(tài)。

以上是抽象后的簡單描述瑟蜈,省略了很多細(xì)節(jié)叭首。


繼續(xù)解釋:

run loop 是不是只能在線程內(nèi)部訪問,執(zhí)行踪栋?

是的。 NSRunLoop 不是線程安全的图毕。所以只在跑這個 run loop 的線程的上下文中獲取比較好夷都。


來一個簡單地給 run loop 添加事件的例子?

上 ?? :

如果想要監(jiān)聽 port , 添加該 port 到 run loop 就可以了予颤,這個 run loop 就會監(jiān)聽該 port 的活動囤官,

- (void)addPort:(NSPort *)aPort forMode:(NSString *)mode

也可以直接給 run loop 添加計時器,

- (void)addTimer:(NSTimer *)aTimer forMode:(NSString *)mode

Run Loop 會還原蛤虐,什么意思党饮?

每一次迭代中,run loop 會按照他的 mode ,處理所有的條件滿足的事件驳庭。這個問題與 run loop 的 mode 相關(guān)刑顺,要看文檔氯窍。


開線程的時候,Run Loop 沒有被喚醒?

大多應(yīng)用蹲堂,主線程的 Run Loop 自動去跑狼讨。

人為開的線程,要去開啟對應(yīng)的 Run Loop 柒竞,響應(yīng)傳入的事件政供。

{

所以, 開線程朽基,用 timer ,需要手動開啟對應(yīng)的 Run Loop

}


能不能在線程外布隔,給線程的 Run Loop 添加事件?

什么意思哈?

不是給 Run Loop 添加事件稼虎。是在持有 Run Loop 的線程中衅檀,添加輸入源,例如計時器事件源渡蜻。該 Run Loop 就會監(jiān)聽事件源的活動术吝。

輸入的數(shù)據(jù)可以來自其他的線程 / 進程。處理輸入的 Run Loop 是監(jiān)聽這些事件源的 Run Loop 茸苇,跑在線程上排苍。


是不是,有時候可以用 Run Loop 堵塞線程一會学密?

是的淘衙。事件處理返回前, Run Loop 會駐留處理事件腻暮。任意 app 中彤守,都會輕易發(fā)現(xiàn)這點。任意的IO操作中哭靖,例如點擊按鈕具垫,加一個睡眠函數(shù)。方法完成了试幽,主 Run Loop 就被阻塞了筝蚕,整個 UI 都掛了。

任何的 Run Loop 中铺坞,都適用起宽。


Run, RunLoop, Run! RunLoop , 跑起來

交互性的應(yīng)用與命令行程序的區(qū)別,就是 RunLoop . 使用命令行程序济榨, 先配參數(shù)開起坯沪,執(zhí)行命令,就結(jié)束了擒滑。交互性的應(yīng)用等待用戶輸入腐晾,給用戶反饋叉弦,然后一直等。很多長周期的進程中赴魁,都有這種機制卸奉。舉個經(jīng)典的例子,服務(wù)端中的

        while( 1 ){ select( ); }

...

CFRunLoop 中最重要的特性是 CFRunLoopModes , RunLoop 的模態(tài)颖御。 RunLoop 處理 Run Loop Sources , Run Loop 的事件源榄棵。事件源登記在 Run Loop 的一到多個模態(tài)上。 Run Loop 必須在一個給定模態(tài)上跑潘拱。事件源新加了事件疹鳄,只要當(dāng)該事件源與Run Loop 當(dāng)前的模態(tài)一致,Run Loop 才處理該事件芦岂。

Mode 分為不同的模式瘪弓, Common, UITracking ... , 也是一種狀態(tài)。 個人覺得禽最,可以叫模態(tài)腺怯。


辛苦啦

建議閱讀 Run Loop 文檔,https://developer.apple.com/documentation/foundation/nsrunloop

線程中 Run Loop 的應(yīng)用川无,

https://developer.apple.com/library/content/documentation/Cocoa/Conceptual/Multithreading/RunLoopManagement/RunLoopManagement.html#//apple_ref/doc/uid/10000057i-CH16-SW1


說明: 為了有意思一些呛占, 我采取了意譯。

本文翻譯自

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末懦趋,一起剝皮案震驚了整個濱河市晾虑,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌仅叫,老刑警劉巖帜篇,帶你破解...
    沈念sama閱讀 216,544評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異诫咱,居然都是意外死亡笙隙,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,430評論 3 392
  • 文/潘曉璐 我一進店門坎缭,熙熙樓的掌柜王于貴愁眉苦臉地迎上來逃沿,“玉大人,你說我怎么就攤上這事幻锁。” “怎么了边臼?”我有些...
    開封第一講書人閱讀 162,764評論 0 353
  • 文/不壞的土叔 我叫張陵哄尔,是天一觀的道長。 經(jīng)常有香客問我柠并,道長岭接,這世上最難降的妖魔是什么富拗? 我笑而不...
    開封第一講書人閱讀 58,193評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮鸣戴,結(jié)果婚禮上啃沪,老公的妹妹穿的比我還像新娘。我一直安慰自己窄锅,他們只是感情好创千,可當(dāng)我...
    茶點故事閱讀 67,216評論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著入偷,像睡著了一般追驴。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上疏之,一...
    開封第一講書人閱讀 51,182評論 1 299
  • 那天殿雪,我揣著相機與錄音,去河邊找鬼锋爪。 笑死丙曙,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的其骄。 我是一名探鬼主播亏镰,決...
    沈念sama閱讀 40,063評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼年栓!你這毒婦竟也來了拆挥?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,917評論 0 274
  • 序言:老撾萬榮一對情侶失蹤某抓,失蹤者是張志新(化名)和其女友劉穎纸兔,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體否副,經(jīng)...
    沈念sama閱讀 45,329評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡汉矿,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,543評論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了备禀。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片洲拇。...
    茶點故事閱讀 39,722評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖曲尸,靈堂內(nèi)的尸體忽然破棺而出赋续,到底是詐尸還是另有隱情,我是刑警寧澤另患,帶...
    沈念sama閱讀 35,425評論 5 343
  • 正文 年R本政府宣布纽乱,位于F島的核電站,受9級特大地震影響昆箕,放射性物質(zhì)發(fā)生泄漏鸦列。R本人自食惡果不足惜租冠,卻給世界環(huán)境...
    茶點故事閱讀 41,019評論 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望薯嗤。 院中可真熱鬧顽爹,春花似錦、人聲如沸骆姐。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,671評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽诲锹。三九已至繁仁,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間归园,已是汗流浹背黄虱。 一陣腳步聲響...
    開封第一講書人閱讀 32,825評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留庸诱,地道東北人捻浦。 一個月前我還...
    沈念sama閱讀 47,729評論 2 368
  • 正文 我出身青樓,卻偏偏與公主長得像桥爽,于是被迫代替她去往敵國和親朱灿。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,614評論 2 353

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