iOS RunLoop

RunLoop總結(jié)

1点楼、每個(gè)應(yīng)用都會(huì)有一個(gè)主線程煞聪,主線程對(duì)應(yīng)一個(gè)runloop卸夕,保證應(yīng)用一直在運(yùn)行
2、default模式的RunLoop是同通過(guò)do…while循環(huán)實(shí)現(xiàn)的
3截驮、獲取RunLopp對(duì)象笑陈,NSRunLoop是基于NSRunLoopRef的封裝
[NSRunLoop currentRunLoop]; // 獲得當(dāng)前線程的RunLoop對(duì)象
[NSRunLoop mainRunLoop]; // 獲得主線程的RunLoop對(duì)象
4、每一個(gè)Thread都對(duì)應(yīng)一個(gè)RunLoop葵袭,主線程的RunLoop會(huì)在創(chuàng)建的時(shí)候自動(dòng)創(chuàng)建涵妥,并且會(huì)保存在Dictionary中,線程的指針會(huì)作為key坡锡,RunLoop作為對(duì)應(yīng)的value蓬网。
子線程中使用currentRunLoop會(huì)獲取子線程對(duì)應(yīng)的RunLoop對(duì)象,如果沒(méi)有鹉勒,系統(tǒng)會(huì)自動(dòng)創(chuàng)建拳缠,并且保存在全局的Dictionary中。如果不獲取贸弥,不會(huì)自動(dòng)創(chuàng)建
5窟坐、一個(gè)RunLoop中包含了很多運(yùn)行modes,但是只能有一個(gè)currentMode绵疲,每個(gè)Mode包含了若干個(gè)Source0哲鸳、Source1、Timer盔憨、Observer
6徙菠、Mode中的Source0代表觸摸事件,Source1代表基于Port的線程間通信郁岩,Timer代表定時(shí)器婿奔,Observer監(jiān)聽(tīng)器(監(jiān)聽(tīng)RunLoop的狀態(tài))
7缺狠、系統(tǒng)默認(rèn)注冊(cè)了5種Mode,主線程默認(rèn)在DefaultMode下運(yùn)行

    1. kCFRunLoopDefaultMode:App的默認(rèn)Mode萍摊,通常主線程是在這個(gè)Mode下運(yùn)行
    1. UITrackingRunLoopMode:界面跟蹤 Mode挤茄,用于 ScrollView 追蹤觸摸滑動(dòng),保證界面滑動(dòng)時(shí)不受其他 Mode 影響
    1. UIInitializationRunLoopMode: 在剛啟動(dòng) App 時(shí)第進(jìn)入的第一個(gè) Mode冰木,啟動(dòng)完成后就不再使用穷劈,會(huì)切換到kCFRunLoopDefaultMode
    1. GSEventReceiveRunLoopMode: 接受系統(tǒng)事件的內(nèi)部 Mode,通常用不到
    1. kCFRunLoopCommonModes: 這是一個(gè)占位用的Mode踊沸,作為標(biāo)記kCFRunLoopDefaultMode和UITrackingRunLoopMode用歇终,并不是一種真正的Mode

8、主線程中運(yùn)行的Timer逼龟,如果滑動(dòng)table或者TextView评凝,Timer會(huì)停止計(jì)數(shù),是因?yàn)镸ode自動(dòng)切換到了UITrackingRunLoopMode腺律,DefaultMode下的Timer就停止運(yùn)行了肥哎。可以使用KCFRunLoopCommonModes疾渣,使加入到主線程的Timer即可以在DefaultMode下運(yùn)行也可以在UITrackingRunLoopMode下運(yùn)行

9、使用GCD創(chuàng)建定時(shí)器

<colgroup><col style="width: 936px;"></colgroup>
| 
-(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event

{
    //創(chuàng)建隊(duì)列
    dispatch_queue_t queue = dispatch_get_global_queue(0, 0);
    //1.創(chuàng)建一個(gè)GCD定時(shí)器
    /*
     第一個(gè)參數(shù):表明創(chuàng)建的是一個(gè)定時(shí)器
     第四個(gè)參數(shù):隊(duì)列
     */
    dispatch_source_t timer = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0, queue);
    // 需要對(duì)timer進(jìn)行強(qiáng)引用崖飘,保證其不會(huì)被釋放掉榴捡,才會(huì)按時(shí)調(diào)用block塊
    // 局部變量,讓指針強(qiáng)引用
    self.timer = timer;
    //2.設(shè)置定時(shí)器的開(kāi)始時(shí)間,間隔時(shí)間,精準(zhǔn)度
    /*
     第1個(gè)參數(shù):要給哪個(gè)定時(shí)器設(shè)置
     第2個(gè)參數(shù):開(kāi)始時(shí)間
     第3個(gè)參數(shù):間隔時(shí)間
     第4個(gè)參數(shù):精準(zhǔn)度 一般為0 在允許范圍內(nèi)增加誤差可提高程序的性能
     GCD的單位是納秒 所以要*NSEC_PER_SEC
     */
    dispatch_source_set_timer(timer, DISPATCH_TIME_NOW, 2.0 * NSEC_PER_SEC, 0 * NSEC_PER_SEC);

    //3.設(shè)置定時(shí)器要執(zhí)行的事情
    dispatch_source_set_event_handler(timer, ^{
        NSLog(@"---%@--",[NSThread currentThread]);
    });
    // 啟動(dòng)
    dispatch_resume(timer);
}

10朱浴、RunLoop主要包含下面五個(gè)類

*   CFRunLoopRef - 獲取主RunLoop和CurrentRunLoop
*   CFRunLoopModeRef - RunLoop運(yùn)行模式吊圾,可以有很多,但是只能選擇一個(gè)翰蠢,系統(tǒng)默認(rèn)定義了5種
*   CFRunLoopSourceRef - 事件源项乒、輸入源
*   CFRunLoopTimerRef - 定時(shí)器
*   CFRunLoopObserverRef - 觀察RunLoop運(yùn)行狀態(tài)

11、CFRunLoopObserverRef可以觀測(cè)到RunLoop的整個(gè)生命周期梁沧,如下

typedef CF_OPTIONS(CFOptionFlags, CFRunLoopActivity) { 
kCFRunLoopEntry = (1UL << 0), // 即將進(jìn)入RunLoop 
kCFRunLoopBeforeTimers = (1UL << 1), // 即將處理Timer 
kCFRunLoopBeforeSources = (1UL << 2), // 即將處理Source 
kCFRunLoopBeforeWaiting = (1UL << 5), //即將進(jìn)入休眠 
kCFRunLoopAfterWaiting = (1UL << 6),// 剛從休眠中喚醒 
kCFRunLoopExit = (1UL << 7),// 即將退出RunLoop 
kCFRunLoopAllActivities = 0x0FFFFFFFU };

12檀何、RunLoop的處理邏輯


image.png

13、CFRunLoopRef種的使用do...while處理各種時(shí)間廷支,先處理Timers频鉴,然后Sources、Blocks恋拍、

14垛孔、RunLoop的處理邏輯


image.png

15、RunLoop的應(yīng)用施敢,常駐線程的使用
通過(guò)創(chuàng)建子線程周荐,并且在子線程中的RunLoop中加入Timer或者Source狭莱,使子線程一直存在,實(shí)現(xiàn)常駐線程
常駐線程可以用來(lái)記錄日志概作,或者上傳日志

17腋妙、CFRunLoop源碼
https://opensource.apple.com/tarballs/CF/

16、編寫測(cè)試代碼

  • 查看各種事件調(diào)用的source
  • 編寫代碼查看RunLoop的運(yùn)行狀態(tài)
  • 實(shí)現(xiàn)常駐線程

參考文檔
1仆嗦、iOS底層原理總結(jié) - RunLoop

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末辉阶,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子瘩扼,更是在濱河造成了極大的恐慌谆甜,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,277評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件集绰,死亡現(xiàn)場(chǎng)離奇詭異规辱,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)栽燕,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,689評(píng)論 3 393
  • 文/潘曉璐 我一進(jìn)店門罕袋,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人碍岔,你說(shuō)我怎么就攤上這事浴讯。” “怎么了蔼啦?”我有些...
    開(kāi)封第一講書人閱讀 163,624評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵榆纽,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我捏肢,道長(zhǎng)奈籽,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書人閱讀 58,356評(píng)論 1 293
  • 正文 為了忘掉前任鸵赫,我火速辦了婚禮衣屏,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘辩棒。我一直安慰自己狼忱,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,402評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布一睁。 她就那樣靜靜地躺著藕赞,像睡著了一般。 火紅的嫁衣襯著肌膚如雪卖局。 梳的紋絲不亂的頭發(fā)上斧蜕,一...
    開(kāi)封第一講書人閱讀 51,292評(píng)論 1 301
  • 那天,我揣著相機(jī)與錄音砚偶,去河邊找鬼批销。 笑死洒闸,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的均芽。 我是一名探鬼主播丘逸,決...
    沈念sama閱讀 40,135評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼掀宋!你這毒婦竟也來(lái)了深纲?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書人閱讀 38,992評(píng)論 0 275
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤劲妙,失蹤者是張志新(化名)和其女友劉穎湃鹊,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體镣奋,經(jīng)...
    沈念sama閱讀 45,429評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡币呵,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,636評(píng)論 3 334
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了侨颈。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片余赢。...
    茶點(diǎn)故事閱讀 39,785評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖哈垢,靈堂內(nèi)的尸體忽然破棺而出妻柒,到底是詐尸還是另有隱情,我是刑警寧澤耘分,帶...
    沈念sama閱讀 35,492評(píng)論 5 345
  • 正文 年R本政府宣布举塔,位于F島的核電站,受9級(jí)特大地震影響陶贼,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜待秃,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,092評(píng)論 3 328
  • 文/蒙蒙 一拜秧、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧章郁,春花似錦枉氮、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 31,723評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至培廓,卻和暖如春惹悄,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背肩钠。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 32,858評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工泣港, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留暂殖,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,891評(píng)論 2 370
  • 正文 我出身青樓当纱,卻偏偏與公主長(zhǎng)得像呛每,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子坡氯,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,713評(píng)論 2 354

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

  • RunLoop 蘋果是如何利用RunLoop實(shí)現(xiàn)自動(dòng)釋放池晨横、延遲回調(diào)、觸摸事件箫柳、屏幕刷新等功能的手形,今天我們就了解一...
    AKyS佐毅閱讀 810評(píng)論 0 23
  • Runloop是iOS和OSX開(kāi)發(fā)中非常基礎(chǔ)的一個(gè)概念滞时,從概念開(kāi)始學(xué)習(xí)叁幢。 RunLoop的概念 -般說(shuō),一個(gè)線程一...
    小貓仔閱讀 995評(píng)論 0 1
  • 簡(jiǎn)述 運(yùn)行循環(huán)坪稽、跑圈 內(nèi)部是一個(gè)do-while循環(huán) 在這個(gè)循環(huán)內(nèi)部不斷處理各種比如(source timer o...
    溫學(xué)振閱讀 676評(píng)論 0 1
  • 一.RunLoop簡(jiǎn)介 運(yùn)行循環(huán)曼玩,在程序運(yùn)行過(guò)程中循環(huán)做一些事情,如果沒(méi)有Runloop程序執(zhí)行完畢就會(huì)立即退出窒百,...
    Jt_Self閱讀 326評(píng)論 0 0
  • RunLoop簡(jiǎn)介 從字面意思來(lái)看是運(yùn)行循環(huán)黍判,在程序運(yùn)行過(guò)程中循環(huán)做一些事情,如果沒(méi)有Runloop程序執(zhí)行完畢就...
    一直很安靜_25ae閱讀 404評(píng)論 0 0