iOS中的Runloop

本節(jié)主要理解:
1.runloop的理解與介紹(相關類與mode)
2.runloop在開發(fā)中的應用(主動使用/隱性調用)
3.runloop與線程的關系
4.Runloop與NSTimer的關系

■應用范疇
口 定時器( Timer )、PerformSelector
口 GCD Async Main Queue
口 事件響應、手勢識別万栅、界面刷新
口 網絡請求
口 AutoreleasePool
偽代碼

int main (int argc ,char * argv[]) [
    @autoreleasepool {
          int retVal = 0;
          do {
            //睡眠中等待消息
            int message = sleep_ and_ _wait();
            //處理消息
            retVal = process. _message (message) ;
          } while (0 == retVal);
          return 0;
     }
}
一.runloop相關的類

Core Foundation關于RunLoop5↑類

  • CFRunLoopRef
  • CFRunLoopModeRef
  • CFRunLoopSourceRef
  • CFRunLoopTimerRef
  • CFRunLoopObserverRef

他們之間的關系可以用下圖表示


圖片.png

■Source0
觸摸事件處理(事件響應)
口performSe lector: onThread :
Source0 只包含了一個回調(函數指針),它并不能主動觸發(fā)事件咕宿。使用時,你需要先調用 CFRunLoopSourceSignal(source)蜡秽,將這個 Source 標記為待處理府阀,然后手動調用 CFRunLoopWakeUp(runloop) 來喚醒 RunLoop,讓其處理這個事件芽突。

■Source1
口基于Port的線程間通信
口系統(tǒng)事件捕捉
Source1 包含了一個 mach_port 和一個回調(函數指針)试浙,被用于通過內核和其他線程相互發(fā)送消息。這種 Source 能主動喚醒 RunLoop 的線程寞蚌。

■Timers
口NSTimer
口perform Selector:with0bject :afterDelay:

■Observers
口用于監(jiān)聽RunLoop的狀態(tài)
口UI刷新( BeforeWaiting )
口 Autorelease pool ( BeforeWaiting )

二.RunloopMode

常見的2種Моdе
kCFRunLoopDefaultMode ( NSDefaultRunLoopMode ) : App的默認mode田巴,通常主線程是在這個mode下運行
UITrackingRunLoopMode :界面跟蹤mode,用于scrollview追蹤觸摸滾動挟秤,保證界面滑動時不受其他mode影響

當使用kCFRunLoopCommonModes模式監(jiān)聽runloop時壹哺,以上兩種模式都將被監(jiān)聽到

二.Runloop在實際開發(fā)中的應用

1.控制線程的生命周期(線程保活)-如AFNetworking
往runloop中添加Source/Timer/Observer
run方法時無法停止的艘刚,它專門用來開啟一個永不銷毀的線程

[NSRunloop currentrunloop] run];

2.解決NSTimer在滑動時停止工作的問題
NSTimer是由RunLoop來管理的管宵,NSTimer其實就是CFRunLoopTimerRef。
因為runloop只能運行在一種模式下,滾動時箩朴,會模式切換笛臣。
使用NSRunLoopCommonModes,會讓NSTimer在兩種模式下工作

    NSTimer *timer = [NSTimer timerWithTimeInterval:1.0 repeats:YES block:^(NSTimer * _Nonnull timer) {
        NSLog(@"%d", ++count);
    }];
//    [[NSRunLoop currentRunLoop] addTimer:timer forMode:NSDefaultRunLoopMode];
//    [[NSRunLoop currentRunLoop] addTimer:timer forMode:UITrackingRunLoopMode];
    
    // NSDefaultRunLoopMode隧饼、UITrackingRunLoopMode才是真正存在的模式
    // NSRunLoopCommonModes并不是一個真的模式,它只是一個標記
    // timer能在_commonModes數組中存放的模式下工作
    [[NSRunLoop currentRunLoop] addTimer:timer forMode:NSRunLoopCommonModes];

3.監(jiān)控應用卡頓/性能優(yōu)化
可以添加Observer到主線程RunLoop中,通過監(jiān)聽RunLoop狀態(tài)切換的耗時,以達到監(jiān)控卡頓的目的

面試題
1.講講RunLoop, ,項目中有用到嗎?
-控制線程的生命周期/調度静陈,(線程毖嘌悖活/線程間通訊切換)
解決NSTimer在滾動時停止工作的問題
監(jiān)控應用卡頓
性能優(yōu)化
2.runloop內部實現(xiàn)邏輯 ?
實際上 RunLoop 就是這樣一個函數,其內部是一個 do-while 循環(huán)鲸拥。當你調用 CFRunLoopRun() 時拐格,線程就會一直停留在這個循環(huán)里;直到超時或被手動停止刑赶,該函數才會返回捏浊。

3.runloop和線程的關系 ?
一個線程對應一個runloop
線程在執(zhí)行完任務后,會處于休眠狀態(tài)撞叨,隨時等待接受新的任務金踪,而不是退出

只有主線程的RunLoop是默認開啟的,所以程序在開啟后牵敷,會一直運行胡岔,不會退出。其他線程的RunLoop如果需要開啟枷餐,就手動開啟

4.NSTimer 與runloop的關系?
1.NSTimer是由RunLoop來管理的靶瘸,NSTimer其實就是CFRunLoopTimerRef。
2.子線程中創(chuàng)建Timer要將其Runloop開啟[[NSRunLoop currentRunLoop]run];否則會不執(zhí)行Timer事件

5.程序中添加每3秒響應一 次的NSTimer ,當拖動tableview時timer可能無法響應要怎么解決?
NSTimer是由RunLoop來管理的毛肋,NSTimer其實就是CFRunLoopTimerRef怨咪。
因為runloop只能運行在一種模式下,滾動時润匙,會模式切換诗眨。
使用NSRunLoopCommonModes,會讓NSTimer在兩種模式下工作

6.runloop 是怎么響應用戶操作的趁桃,具體流程是什么樣的?

圖片.png

(簡介版:由source1接收事件辽话,由source0響應觸摸事件)
用戶交互事件首先在 IOHID 層生成 HIDEvent,然后向事件處理線程的 Source1 的 mach port 發(fā)送 HIDEvent 消息卫病,Source1 的回調函數將事件轉化為 UIEvent 并篩選需要處理的事件推入待處理事件隊列油啤,向主線程的事件處理 Source0 發(fā)送信號,并喚醒主線程蟀苛,主線程檢查到事件處理 Source0 有待處理信號后益咬,觸發(fā) Source0 的回調函數,從待處理事件隊列中提取 UIEvent帜平,最后進入 hit-test 等 UIEvent 事件響應流程幽告。

7.說說runLoop的幾種狀態(tài)

圖片.png

8.runloop的mode作用是什么 ?
model 主要是用來指定事件在運行循環(huán)中的優(yōu)先級的梅鹦,分為:

  • NSDefaultRunLoopMode(kCFRunLoopDefaultMode):默認,空閑狀態(tài)
  • UITrackingRunLoopMode :ScrollView滑動時
  • UIInitializationRunLoopMode :啟動時
  • NSRunLoopCommonModes(kCFRunLoopCommonModes):Mode集

參考
runloop詳解

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末冗锁,一起剝皮案震驚了整個濱河市齐唆,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌冻河,老刑警劉巖箍邮,帶你破解...
    沈念sama閱讀 206,214評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異叨叙,居然都是意外死亡锭弊,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,307評論 2 382
  • 文/潘曉璐 我一進店門擂错,熙熙樓的掌柜王于貴愁眉苦臉地迎上來味滞,“玉大人,你說我怎么就攤上這事钮呀〗0埃” “怎么了?”我有些...
    開封第一講書人閱讀 152,543評論 0 341
  • 文/不壞的土叔 我叫張陵行楞,是天一觀的道長攒暇。 經常有香客問我,道長子房,這世上最難降的妖魔是什么形用? 我笑而不...
    開封第一講書人閱讀 55,221評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮证杭,結果婚禮上田度,老公的妹妹穿的比我還像新娘。我一直安慰自己解愤,他們只是感情好镇饺,可當我...
    茶點故事閱讀 64,224評論 5 371
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著送讲,像睡著了一般奸笤。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上哼鬓,一...
    開封第一講書人閱讀 49,007評論 1 284
  • 那天监右,我揣著相機與錄音,去河邊找鬼异希。 笑死健盒,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播扣癣,決...
    沈念sama閱讀 38,313評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼惰帽,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了父虑?” 一聲冷哼從身側響起该酗,我...
    開封第一講書人閱讀 36,956評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎士嚎,沒想到半個月后垂涯,有當地人在樹林里發(fā)現(xiàn)了一具尸體,經...
    沈念sama閱讀 43,441評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡航邢,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 35,925評論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了骄蝇。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片膳殷。...
    茶點故事閱讀 38,018評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖九火,靈堂內的尸體忽然破棺而出赚窃,到底是詐尸還是另有隱情,我是刑警寧澤岔激,帶...
    沈念sama閱讀 33,685評論 4 322
  • 正文 年R本政府宣布勒极,位于F島的核電站,受9級特大地震影響虑鼎,放射性物質發(fā)生泄漏辱匿。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,234評論 3 307
  • 文/蒙蒙 一炫彩、第九天 我趴在偏房一處隱蔽的房頂上張望匾七。 院中可真熱鬧,春花似錦江兢、人聲如沸昨忆。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,240評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽邑贴。三九已至,卻和暖如春叔磷,著一層夾襖步出監(jiān)牢的瞬間拢驾,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,464評論 1 261
  • 我被黑心中介騙來泰國打工世澜, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留独旷,地道東北人。 一個月前我還...
    沈念sama閱讀 45,467評論 2 352
  • 正文 我出身青樓,卻偏偏與公主長得像嵌洼,于是被迫代替她去往敵國和親案疲。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 42,762評論 2 345

推薦閱讀更多精彩內容

  • 開胃面試題 1.講講 RunLoop麻养,項目中有用到嗎褐啡?2.RunLoop內部實現(xiàn)邏輯?2.Runloop和線程的關...
    非洲小白猿閱讀 2,297評論 0 11
  • 面試題 1.講講 RunLoop鳖昌,項目中有用到嗎备畦? 應用1:創(chuàng)建常駐線程 + (void)networkReque...
    半路qzg閱讀 411評論 0 1
  • 1)作用 讓線程能隨時處理事件但并不退出平常:一個線程一次只能執(zhí)行一個任務,執(zhí)行完成后線程就會退出 處理 APP ...
    _涼風_閱讀 582評論 2 0
  • 1.Runloop基礎知識 1.1 字面意思 a 運行循環(huán) b 跑圈 1.2 基本作用(作用重大) a 保持...
    iOS小王子閱讀 357評論 0 2
  • Runloop 是和線程緊密相關的一個基礎組件许昨,是很多線程有關功能的幕后功臣懂盐。盡管在平常使用中幾乎不太會直接用到,...
    jackyshan閱讀 9,843評論 10 75