iOS底層機(jī)制之運(yùn)行循環(huán)runloop

runloop是iOS底層機(jī)制中保持我們的程序一直運(yùn)行的機(jī)制旁瘫。他可以讓線程一直循環(huán)不退出。而在我們正常的編程中握爷。線程其實(shí)是線性的,當(dāng)線程處理完我們的代碼以后就自動(dòng)退出了襟交。runloop就是保證我們的應(yīng)用程序在沒有人操縱的情況下也能一直運(yùn)行的一種機(jī)制。
當(dāng)用戶打開我們的APP時(shí)伤靠,首先系統(tǒng)會(huì)初始化我們的APP捣域。我們知道Objective-c語(yǔ)言其實(shí)是C語(yǔ)言的擴(kuò)充。也就是說(shuō)他與C語(yǔ)言一樣是以main函數(shù)作為程序的入口宴合。我們創(chuàng)建一個(gè)工程時(shí)會(huì)在main文件中發(fā)現(xiàn)這樣的代碼

int main(int argc, char * argv[]) {
    @autoreleasepool {
        return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
    }
}

這是我們應(yīng)用程序的入口焕梅。其中UIApplicationMain就自動(dòng)的為我們的主線程啟動(dòng)了RunLoop。
當(dāng)應(yīng)用啟動(dòng)了之后形纺,如果用戶進(jìn)行了操作丘侠,則處理用戶的事件。如果用戶沒有進(jìn)行任何操作逐样,則主線程進(jìn)行等待。直到程序退出打肝。
而對(duì)于其他的線程來(lái)說(shuō)脂新,runloop并不是默認(rèn)啟動(dòng)的。需要我們顯式的調(diào)用他

NSRunLoop *runloop = [NSRunLoop currentRunLoop];

每一個(gè)線程的RunLoop是唯一的争便,如果我們不自己創(chuàng)建他的話就永遠(yuǎn)不會(huì)被創(chuàng)建断医。
值得一提的是在iOS/OSX中提供了兩個(gè)RunLoop對(duì)象:

  • CFRunLoopRef 是在 CoreFoundation 框架內(nèi)的,它提供了純 C 函數(shù)的 API鉴嗤,所有這些 API 都是線程安全的。
  • NSRunLoop 是基于 CFRunLoopRef 的封裝醉锅,提供了面向?qū)ο蟮?API,但是這些 API 不是線程安全的垄琐。

也就是說(shuō)我們不能在一個(gè)進(jìn)程中操作另一個(gè)進(jìn)程的RunLoop经柴,這樣會(huì)造成意想不到的后果。但是我們卻可以獲取到NSRunLoop的CFRunLoopRef對(duì)象翻擒,來(lái)達(dá)到線程安全的目的:

- (CFRunLoopRef)getCFRunLoop;

NSRunLoop中有五個(gè)Mode:

  • kCFRunLoopDefaultMode: 默認(rèn) mode,通常主線程在這個(gè) Mode 下運(yùn)行韭寸。
  • UITrackingRunLoopMode: 追蹤mode恩伺,保證Scrollview滑動(dòng)順暢不受其他 mode 影響。
  • UIInitializationRunLoopMode: 啟動(dòng)程序后的過渡mode晶渠,啟動(dòng)完成后就不再使用。
  • GSEventReceiveRunLoopMode: Graphic相關(guān)事件的mode便瑟,通常用不到番川。
  • kCFRunLoopCommonModes: 占位mode颁督,作為標(biāo)記DefaultMode和CommonMode用。

在runloop中不同的事件處理會(huì)切換到不同的mode下運(yùn)行沉御。
當(dāng)我們?cè)诨瑒?dòng)一個(gè)View時(shí),runloop會(huì)切換到trackingMode下運(yùn)行伐谈。這時(shí)候就會(huì)發(fā)生一些我們不希望發(fā)生的事情诵棵。比如我們使用了一個(gè)計(jì)時(shí)器。是默認(rèn)在default下運(yùn)行的非春。這時(shí)候當(dāng)我們滑動(dòng)一個(gè)View時(shí)缓屠,比如ScrollView敌完。計(jì)時(shí)器就會(huì)暫停。因?yàn)檫@時(shí)候runloop已經(jīng)切換到TrackingMode下了什湘。

NSRunLoop *runLoop = [NSRunLoop currentRunLoop];
[runLoop addTimer:timer forMode: NSRunLoopCommonModes];

forMode的參數(shù)有兩種類型可供選擇: NSDefaultRunLoopMode 长赞, NSRunLoopCommonModes得哆。

NSRunLoopCommonModes 能夠在多線程中起作用贩据,這個(gè)模式等效于NSDefaultRunLoopMode和NSEventTrackingRunLoopMode的結(jié)合闸餐,這也是將modes換為NSRunLoopCommonModes便可解決的原因。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末近上,一起剝皮案震驚了整個(gè)濱河市壹无,隨后出現(xiàn)的幾起案子和媳,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,542評(píng)論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件她倘,死亡現(xiàn)場(chǎng)離奇詭異作箍,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)荧止,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,822評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門跃巡,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)牧愁,“玉大人,你說(shuō)我怎么就攤上這事猪半⊥迪撸” “怎么了声邦?”我有些...
    開封第一講書人閱讀 163,912評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵摆舟,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我歇式,道長(zhǎng)材失,這世上最難降的妖魔是什么硫豆? 我笑而不...
    開封第一講書人閱讀 58,449評(píng)論 1 293
  • 正文 為了忘掉前任熊响,我火速辦了婚禮,結(jié)果婚禮上秸弛,老公的妹妹穿的比我還像新娘洪碳。我一直安慰自己,他們只是感情好绞铃,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,500評(píng)論 6 392
  • 文/花漫 我一把揭開白布儿捧。 她就那樣靜靜地躺著挑宠,像睡著了一般。 火紅的嫁衣襯著肌膚如雪亿汞。 梳的紋絲不亂的頭發(fā)上疗我,一...
    開封第一講書人閱讀 51,370評(píng)論 1 302
  • 那天,我揣著相機(jī)與錄音旧找,去河邊找鬼麦牺。 笑死,一個(gè)胖子當(dāng)著我的面吹牛魏颓,可吹牛的內(nèi)容都是我干的吱晒。 我是一名探鬼主播,決...
    沈念sama閱讀 40,193評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼叹话,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼驼壶!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起热凹,我...
    開封第一講書人閱讀 39,074評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤碌嘀,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后和蚪,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體攒霹,經(jīng)...
    沈念sama閱讀 45,505評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡浆洗,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,722評(píng)論 3 335
  • 正文 我和宋清朗相戀三年抠刺,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片速妖。...
    茶點(diǎn)故事閱讀 39,841評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡罕容,死狀恐怖锦秒,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情惭笑,我是刑警寧澤,帶...
    沈念sama閱讀 35,569評(píng)論 5 345
  • 正文 年R本政府宣布脖咐,位于F島的核電站,受9級(jí)特大地震影響汇歹,放射性物質(zhì)發(fā)生泄漏屁擅。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,168評(píng)論 3 328
  • 文/蒙蒙 一产弹、第九天 我趴在偏房一處隱蔽的房頂上張望派歌。 院中可真熱鬧,春花似錦痰哨、人聲如沸胶果。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,783評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)早抠。三九已至,卻和暖如春撬讽,著一層夾襖步出監(jiān)牢的瞬間蕊连,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,918評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工游昼, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留甘苍,地道東北人载庭。 一個(gè)月前我還...
    沈念sama閱讀 47,962評(píng)論 2 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親簸淀。 傳聞我的和親對(duì)象是個(gè)殘疾皇子租幕,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,781評(píng)論 2 354

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