RunLoop

1.什么是RunLoop

相當(dāng)于一個do-while循環(huán)的對象,在循環(huán)中處理各種事件來保持程序運(yùn)行,沒有事件處理時線程會休眠,在有事件時才會喚醒線程來處理连躏,節(jié)省CPU資源,提高效率贞滨。

一個線程對應(yīng)一個runloop對象入热,主線程的是系統(tǒng)創(chuàng)建,子線程的需要自己創(chuàng)建晓铆,在第一次獲取runloop時創(chuàng)建勺良,在線程結(jié)束時銷毀。

runloop保存在一個全局的dictionary里骄噪,key是線程尚困,value是runloop。

2.RunLoop Mode-運(yùn)行模式

做不同的事情會切換到不同的mode來執(zhí)行

NSDefaultRunLoopMode:默認(rèn)運(yùn)行mode链蕊,主線程一般在這個mode運(yùn)行事甜,當(dāng)用戶停止操作時候會在這個mode,沒有任務(wù)執(zhí)行了就會休眠示弓。

UITrackingRunLoopMode:界面跟蹤mode讳侨,用于scrollview追蹤滑動呵萨,保證界面滑動時不受其他mode影響奏属。

NSRunLoopCommonModes:占位mode,不是真正的運(yùn)行mode潮峦,會同時處理默認(rèn)mode和UImode的事件囱皿。

以上是實(shí)際開放的mode。

UIInitializationRunLoopMode:在剛啟動時第一個mode忱嘹,啟動完就不再使用了嘱腥。

GSEventReceiveRunLoopMode:接收系統(tǒng)事件的內(nèi)部mode,通常用不到拘悦。

3.RunLoop Source-事件源/輸入源

sources0:非基于mach_port的齿兔,一般為內(nèi)部的事件,如觸摸事件础米、selector事件分苇。

sources1:基于mach_port的內(nèi)核事件,可以由系統(tǒng)內(nèi)核或者其他進(jìn)程或者線程主動喚醒屁桑。

像點(diǎn)擊屏幕医寿,由source0進(jìn)行接收,分發(fā)到souces1處理蘑斧。

4.定時源:就是定時器靖秩,NSTimer

子線程定時器默認(rèn)不開啟须眷,如果在子線程中執(zhí)行需要手動開啟runloop。

timerWithTimeInterval是不加入到loop中沟突。

scheduledTimerWithTimeInterval會默認(rèn)加到默認(rèn)mode中花颗。

在滑動scrollview時會觸發(fā)UImode,需要將timer加入到UImode或者commonmode事扭,才能觸發(fā)捎稚。

5.RunLoop Observer-觀察者

監(jiān)聽runloop的狀態(tài)改變

6.RunLoop運(yùn)行邏輯

7.RunLoop實(shí)際應(yīng)用

a、autoreleasepool自動釋放池

在主線程的runloop里注冊了兩個observer求橄,即將進(jìn)入(Entry)loop時創(chuàng)建_objc_autoreleasePoolPush()今野,優(yōu)先級最高;在即將休眠(BeforeWaiting)時會釋放舊池并創(chuàng)建新池_objc_autoreleasePoolPop()和_objc_autoreleasePoolPush()罐农,即將退出(Exit)loop時會釋放池子_objc_autoreleasePoolPop()条霜,優(yōu)先級最低。

b涵亏、更新UI

在mainloolp中即將休眠(BeforeWaiting)和即將退出(Exit)注冊宰睡,會檢查setNeedDisplay判斷視圖是否需要更新,所以更新UI需要在主線程中气筋。

c拆内、線程保活

NSCondition條件鎖宠默,當(dāng)有任務(wù)時喚醒線程來處理麸恍。

利用runloop保活:

runloop開啟方式:

d搀矫、監(jiān)聽優(yōu)化系統(tǒng)卡頓

1)當(dāng)runloop長時間停在kCFRunLoopBeforeSources抹沪,導(dǎo)致無法休眠,或者停在kCFRunLoopAfterWaiting瓤球,在喚醒后接受時間太長融欧,就可以認(rèn)為是卡頓。

2)注冊觀察者卦羡,并添加到主線程的commonmode中噪馏,觀察runloop的所有狀態(tài),設(shè)置回調(diào)函數(shù)

3)設(shè)置信號量為0绿饵,如果<0則會阻塞當(dāng)前線程欠肾,在子線程使用wait阻塞線程,并設(shè)置超時時間蝴罪,超時會signal繼續(xù)執(zhí)行線程董济,或者收到主線程的消息,也會signal

4)當(dāng)長時間被阻塞要门,查看是否在beforesources或者afterwaiting狀態(tài)并且超時了虏肾,記為卡頓廓啊。

最后編輯于
?著作權(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)容

  • 概述 RunLoop作為iOS中一個基礎(chǔ)組件和線程有著千絲萬縷的關(guān)系,同時也是很多常見技術(shù)的幕后功臣切厘。盡管在平時多...
    陽明先生_X自主閱讀 1,105評論 0 17
  • 官方文檔:Apple CoreFoundation源碼RunLoop 文檔(舊)NSRunLoopCFRunLoo...
    coder_my閱讀 323評論 0 1
  • 最近看了很多RunLoop的文章萨咳,看完很懵逼,決心整理一下疫稿,文章中大部分內(nèi)容都是引用大神們的培他,但好歹對自己有個交代...
    小涼介閱讀 6,728評論 12 79
  • 蘋果對runloop的使用 蘋果在AutoreleasePool、手勢識別遗座、事件響應(yīng)舀凛、UI更新、定時器途蒋、NSObj...
    進(jìn)擊的小杰閱讀 431評論 0 0
  • 1猛遍、RunLoop初探 1.1、RunLoop是什么号坡? RunLoop從字面上來說是跑圈的意思懊烤,如果這樣理解不免有...
    風(fēng)緊扯呼閱讀 724評論 0 5