iOS開發(fā) runloop理解

介紹:

“消息”循環(huán)戴陡,等待消息(會休眠)->接收消息->處理消息。通過上面的代碼耗啦,runloop本質就是提供了一種消息處理模式,只不過它封裝抽象的太好了(一般開發(fā)的時候根本就感覺不到半夷,或者說不用關心)。

runloop相當于幫我們打包了各種消息迅细,并將消息發(fā)送給指定的接受者巫橄。“

可以將runloop理解為一個函數(shù)茵典,功能是一個消息循環(huán)湘换,有消息則處理,沒有消息則休眠统阿。

(注意:runloop實質是一個對象彩倚,但是不影響以上的假設)


線程剛創(chuàng)建時并沒有 RunLoop,如果你不主動獲取扶平,那它一直都不會有帆离。RunLoop 的創(chuàng)建是發(fā)生在第一次獲取時,RunLoop 的銷毀是發(fā)生在線程結束時结澄。你只能在一個線程的內部獲取其 RunLoop(主線程除外)哥谷。


系統(tǒng)為我們提供了多種模式,下面列一些比較常遇到的:

kCFRunLoopDefaultMode: App的默認 Mode,通常主線程是在這個 Mode 下運行的麻献。

UITrackingRunLoopMode: 界面跟蹤 Mode们妥,用于 ScrollView 追蹤觸摸滑動,保證界面滑動時不受其他 Mode 影響勉吻。

UIInitializationRunLoopMode: 在剛啟動 App 時第進入的第一個 Mode监婶,啟動完成后就不再使用。

NSRunLoopCommonModes: 包含了多種模式:default, modal, 和tracking modes齿桃。



參考:

NSRunLoop原理詳解——不再有盲點?

iOS runloop和線程有什么關系惑惶??

iOS - run loop詳解 - 簡書

iOS面試題:runloop 和線程有什么關系??

runloop 和線程的關系:

1 run oop和線程是緊密相連的源譬,可以這樣說run loop是為了線程而生集惋,沒有線程,它就沒有存在的必要踩娘。Run loops是線程的基礎架構部分

2 一條線程對應一個RunLoop對象刮刑,每條線程都有唯一一個與之對應的RunLoop對象。

3 我們只能在當前線程中操作當前線程的RunLoop养渴,而不能去操作其他線程的RunLoop雷绢。

4 RunLoop對象在第一次獲取RunLoop時創(chuàng)建,銷毀則是在線程結束的時候理卑。

5 主線程的RunLoop對象系統(tǒng)自動幫助我們創(chuàng)建好了(原理如下)翘紊,而子線程的RunLoop對象需要我們主動創(chuàng)建。


使用:

1藐唠、NSTimer的創(chuàng)建使用

當實例化NSTimer對象的時候帆疟,通常會使用 scheduledTimerWithTimeInterval 方法鹉究。該方法會自動為我們實例化的timer添加到當前線程的RunLoop中,并且默認模式是?NSDefaultRunLoopMode踪宠。但當前線程是主線程時自赔,某些UI事件,比如ScrollView正在拖動柳琢,將會RunLoop切換成 NSEventTrackingRunLoopMode 模式绍妨,在這個模式下,默認的?NSDefaultRunLoopMode 模式中注冊的事件是不會執(zhí)行的柬脸。也就是說他去,使用?scheduledTimerWithTimeInterval 方法添加到RunLoop中的Timer就不會執(zhí)行。

為了設置一個不被UI干擾的Timer倒堕,我們需要手動創(chuàng)建一個Timer灾测,然后使用RunLoop的 addTimer:forMode: 方法來把Timer按照指定的模式加入到RunLoop中。這里使用?NSRunLoopCommonModes 模式涩馆,這個模式相當于?NSDefaultRunLoopMode 和?NSEventTrackingRunLoopMode 的結合行施。

2 ImageView推遲顯示

一些動畫執(zhí)行過程中,

或者scrllview滑動過程匯總image的顯示

[cell performSelector:@selector(setImage)withObject:nil afterDelay:0 inModes:@[NSDefaultRunLoopMode]];

[imageview?performSelector: inModes: ]

3 后臺常駐線程(很常用)

我們在開發(fā)應用程序的過程中魂那,如果后臺操作特別頻繁牍汹,經(jīng)常會在子線程做一些耗時操作(下載文件鲜侥、后臺播放音樂等),我們最好能讓這條線程永遠常駐內存瘸爽。

那么怎么做呢展运?

添加一條用于常駐內存的強引用的子線程活逆,在該線程的RunLoop下添加一個Sources,開啟RunLoop拗胜。

具體實現(xiàn)過程如下:

在項目的ViewController.m中添加一條強引用的thread線程屬性蔗候,如下圖:

在viewDidLoad中創(chuàng)建線程self.thread,使線程啟動并執(zhí)行run1方法埂软,代碼如下锈遥。在Demo中,請在viewDidLoad調用[self showDemo4];方法勘畔。

運行之后發(fā)現(xiàn)打印了----run1-----所灸,而未開啟RunLoop則未打印。

這時炫七,我們就開啟了一條常駐線程爬立,下邊我們來試著添加其他任務,除了之前創(chuàng)建的時候調用了run1方法万哪,我們另外在點擊的時候調用run2方法侠驯。

那么抡秆,我們在touchesBegan中調用PerformSelector,從而實現(xiàn)在點擊屏幕的時候調用run2方法吟策。具體代碼如下:

-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event

{ ? ? ? //利用performSelector儒士,在self.thread的線程中調用run2方法執(zhí)行任務

? ? [self performSelector:@selector(run2)onThread:self.thread withObject:nil waitUntilDone:NO];

}

-(void)run2

{

?? ?NSLog(@"----run2------");

}

經(jīng)過運行測試,除了之前打印的----run1-----踊挠,每當我們點擊屏幕乍桂,都能調用----run2------

這樣我們就實現(xiàn)了常駐線程的需求效床。

作者:進擊的阿牛哥

鏈接:http://www.reibang.com/p/f47ec06097ef

來源:簡書

著作權歸作者所有睹酌。商業(yè)轉載請聯(lián)系作者獲得授權,非商業(yè)轉載請注明出處剩檀。

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末憋沿,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子沪猴,更是在濱河造成了極大的恐慌辐啄,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,941評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件运嗜,死亡現(xiàn)場離奇詭異壶辜,居然都是意外死亡,警方通過查閱死者的電腦和手機担租,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,397評論 3 395
  • 文/潘曉璐 我一進店門砸民,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人奋救,你說我怎么就攤上這事岭参。” “怎么了尝艘?”我有些...
    開封第一講書人閱讀 165,345評論 0 356
  • 文/不壞的土叔 我叫張陵演侯,是天一觀的道長。 經(jīng)常有香客問我背亥,道長秒际,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,851評論 1 295
  • 正文 為了忘掉前任隘梨,我火速辦了婚禮程癌,結果婚禮上,老公的妹妹穿的比我還像新娘轴猎。我一直安慰自己嵌莉,他們只是感情好,可當我...
    茶點故事閱讀 67,868評論 6 392
  • 文/花漫 我一把揭開白布捻脖。 她就那樣靜靜地躺著锐峭,像睡著了一般中鼠。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上沿癞,一...
    開封第一講書人閱讀 51,688評論 1 305
  • 那天援雇,我揣著相機與錄音,去河邊找鬼椎扬。 笑死惫搏,一個胖子當著我的面吹牛,可吹牛的內容都是我干的蚕涤。 我是一名探鬼主播筐赔,決...
    沈念sama閱讀 40,414評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼揖铜!你這毒婦竟也來了茴丰?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 39,319評論 0 276
  • 序言:老撾萬榮一對情侶失蹤天吓,失蹤者是張志新(化名)和其女友劉穎贿肩,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體龄寞,經(jīng)...
    沈念sama閱讀 45,775評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡汰规,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,945評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了物邑。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片控轿。...
    茶點故事閱讀 40,096評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖拂封,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情鹦蠕,我是刑警寧澤冒签,帶...
    沈念sama閱讀 35,789評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站钟病,受9級特大地震影響萧恕,放射性物質發(fā)生泄漏。R本人自食惡果不足惜肠阱,卻給世界環(huán)境...
    茶點故事閱讀 41,437評論 3 331
  • 文/蒙蒙 一票唆、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧屹徘,春花似錦走趋、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,993評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽氮唯。三九已至,卻和暖如春姨伟,著一層夾襖步出監(jiān)牢的瞬間惩琉,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,107評論 1 271
  • 我被黑心中介騙來泰國打工夺荒, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留瞒渠,地道東北人。 一個月前我還...
    沈念sama閱讀 48,308評論 3 372
  • 正文 我出身青樓技扼,卻偏偏與公主長得像伍玖,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子淮摔,可洞房花燭夜當晚...
    茶點故事閱讀 45,037評論 2 355

推薦閱讀更多精彩內容

  • RunLoop的定義與概念RunLoop的主要作用main函數(shù)中的RunLoopRunLoop與線程的關系RunL...
    __silhouette閱讀 1,012評論 0 6
  • 目錄 Runloop RunLoop 與線程 個人理解總結 應用場景 1. 什么是RunLoop 基本作用 保持程...
    Ryan___閱讀 1,502評論 0 13
  • runtime 和 runloop 作為一個程序員進階是必須的私沮,也是非常重要的, 在面試過程中是經(jīng)常會被問到的和橙, ...
    made_China閱讀 1,210評論 0 7
  • 概述 RunLoop作為iOS中一個基礎組件和線程有著千絲萬縷的關系仔燕,同時也是很多常見技術的幕后功臣。盡管在平時多...
    sumrain_cloud閱讀 948評論 0 5
  • RunLoop 文章目錄 RunLoop簡介 1.1 什么是RunLoop魔招? 1.2 RunLoop和線程 1.3...
    May_d8f1閱讀 286評論 0 1