RunLoop

  • 是通過內(nèi)部維護的事件循環(huán)來對事件/消息進行管理的一個對象
  • 基本作用
    • 保持程序的持續(xù)運行
    • 處理App中的各種事件(比如觸摸事件粱坤、定時器事件氏淑、Selector事件)
    • 節(jié)省CPU資源识藤,提高程序性能:該做事時做事莺戒,該休息時休息
  • main函數(shù)中的RunLoop
int main(int argc, char * argv[]) {
    @autoreleasepool {
        return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
    }
}
// 第三行代碼的UIApplicationMain函數(shù)內(nèi)部就啟動了一個RunLoop懊昨,所以UIApplicationMain函數(shù)一直沒有返回,保持了程序的持續(xù)運行迅皇,這個函數(shù)啟動的RunLoop是跟主線程相關(guān)聯(lián)的
  • RunLoop對象
    • iOS有2套API來訪問和使用RunLoop
      • Foundation(OC)
        NSRunLoop
      • Core Foundation(C語言)
        CFRunLoopRef
  • RunLoop與線程
    • 每條線程都有唯一的一個與之對應(yīng)的RunLoop對象
    • 主線程的RunLoop已經(jīng)自動創(chuàng)建好了昧辽,子線程的RunLoop需要手動創(chuàng)建
    • RunLoop在第一次獲取時間創(chuàng)建,在線程結(jié)束時銷毀
  • 獲得RunLoop對象
    • Foundation
      [NSRunLoop currentRunLoop];// 獲得當前線程的RunLoop對象
      [NSRunLoop mainRunLoop];// 獲得主線程的RunLoop對象
    • Core Foundation
      CFRunLoopGetCurrent();// 獲得當前線程的RunLoop對象
      CFRunLoopGetMain();// 獲得主線程的RunLoop對象
  • RunLoop相關(guān)類
    • CFRunLoopRef
    • CFRunLoopModeRef
    • CFRunLoopSourceRef
    • CFRunLoopTimerRef
    • CFRunLoopObserverRef
  • CFRunLoopModeRef
    • CFRunLoopModeRef代表RunLoop的運行模式
    • 一個RunLoop包含若干個Mode登颓,每個Mode又包含若干個Source/Timer/Observer
    • 每次RunLoop啟動時搅荞,只能指定其中一個Mode,這個Mode被稱為CurrentMode
    • 如果需要切換Mode框咙,只能退出RunLoop咕痛,再重新指定一個Mode進入
    • 這樣做主要是為了分割開不同組的Source/Timer/Observer,讓其互不影響
    • 系統(tǒng)默認注冊了5個Mode
      • kCFRunLoopDefaultMode:App的默認Mode喇嘱,通常主線程是在這個Mode下運行
      • UITrackingRunLoopMode:界面跟蹤Mode茉贡,用于Scrollview追蹤觸摸滑動,保證界面滑動時不受其他Mode影響
      • UIInitializationRunLoopMode:在剛啟動App時進入的第一個Mode者铜,啟動完成后就不再使用
      • GSEventReceiveRunLoopMode:接受系統(tǒng)事件的內(nèi)部Mode腔丧,通常用不到
      • kCFRunLoopCommonModes:這是一個占位的Mode放椰,不是一種真正的Mode
  • CFRunLoopSourceRef
    • CFRunLoopSourceRef是事件源(輸入源)
      • Source0:非基于Port的
      • Source1:基于Port的
  • CFRunLoopTimerRef
    • CFRunLoopTimerRef是基于時間的觸發(fā)器
    • 基本上說的就是NSTimer
  • CFRunLoopObserverRef
    • CFRunLoopObserverRef是觀察者,能夠監(jiān)聽RunLoop的狀態(tài)改變
    • 可以監(jiān)聽的時間有以下幾個:
typedef CF_OPTIONS(CFOptionFlags, CFRunLoopActivity) {
      kCFRunLoopEntry = (1UL << 0),
      kCFRunLoopBeforeTimers = (1UL << 1),
      kCFRunLoopBeforeSources = (1UL << 2),
      kCFRunLoopBeforeWaiting = (1UL << 5),
      kCFRunLoopAfterWaiting = (1UL << 6),
      kCFRunLoopExit = (1UL << 7),
      kCFRunLoopAllActivities = 0x0FFFFFFFU
};  
  • RunLoop處理邏輯
    RunLoop的事件隊列
    每次運行RunLoop愉粤,線程的RunLoop會自動處理之前未處理的消息砾医,并通知相關(guān)的觀察者。具體的順序如下
    1. 通知觀察者RunLoop已經(jīng)啟動
    • 通知觀察者任何即將要開始的定時器
    • 通知觀察者任何即將啟動的非基于端口的源
    • 啟動任何準備好的非基于端口的源
    • 如果基于端口的源準備好并處于等待狀態(tài)衣厘,立即啟動如蚜,并進入步驟9
    • 通知觀察者線程進入休眠
    • 將線程置于休眠直到任一下面的事件發(fā)生
      • 某一事件到達基于端口的源
      • 定時器啟動
      • RunLoop設(shè)置的時間已經(jīng)超時
      • RunLoop被顯式喚醒
    • 通知觀察者線程將被喚醒
    • 處理未處理的事件
      • 如果用戶定義的定時器啟動,處理定時器事件并重啟RunLoop影暴。進入步驟2
      • 如果輸入源啟動错邦,傳遞相應(yīng)的消息
      • 如果RunLoop被顯式喚醒而且時間還沒超時,重啟RunLoop坤检。進入步驟2
    • 通知觀察者RunLoop結(jié)束
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市期吓,隨后出現(xiàn)的幾起案子早歇,更是在濱河造成了極大的恐慌,老刑警劉巖讨勤,帶你破解...
    沈念sama閱讀 219,490評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件箭跳,死亡現(xiàn)場離奇詭異,居然都是意外死亡潭千,警方通過查閱死者的電腦和手機谱姓,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,581評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來刨晴,“玉大人屉来,你說我怎么就攤上這事”否” “怎么了茄靠?”我有些...
    開封第一講書人閱讀 165,830評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長蝶桶。 經(jīng)常有香客問我慨绳,道長,這世上最難降的妖魔是什么真竖? 我笑而不...
    開封第一講書人閱讀 58,957評論 1 295
  • 正文 為了忘掉前任脐雪,我火速辦了婚禮,結(jié)果婚禮上恢共,老公的妹妹穿的比我還像新娘战秋。我一直安慰自己,他們只是感情好讨韭,可當我...
    茶點故事閱讀 67,974評論 6 393
  • 文/花漫 我一把揭開白布获询。 她就那樣靜靜地躺著涨岁,像睡著了一般。 火紅的嫁衣襯著肌膚如雪吉嚣。 梳的紋絲不亂的頭發(fā)上梢薪,一...
    開封第一講書人閱讀 51,754評論 1 307
  • 那天,我揣著相機與錄音尝哆,去河邊找鬼秉撇。 笑死,一個胖子當著我的面吹牛秋泄,可吹牛的內(nèi)容都是我干的琐馆。 我是一名探鬼主播,決...
    沈念sama閱讀 40,464評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼恒序,長吁一口氣:“原來是場噩夢啊……” “哼瘦麸!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起歧胁,我...
    開封第一講書人閱讀 39,357評論 0 276
  • 序言:老撾萬榮一對情侶失蹤滋饲,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后喊巍,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體屠缭,經(jīng)...
    沈念sama閱讀 45,847評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,995評論 3 338
  • 正文 我和宋清朗相戀三年崭参,在試婚紗的時候發(fā)現(xiàn)自己被綠了呵曹。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,137評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡何暮,死狀恐怖奄喂,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情海洼,我是刑警寧澤砍聊,帶...
    沈念sama閱讀 35,819評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站贰军,受9級特大地震影響玻蝌,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜词疼,卻給世界環(huán)境...
    茶點故事閱讀 41,482評論 3 331
  • 文/蒙蒙 一俯树、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧贰盗,春花似錦许饿、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,023評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽球化。三九已至,卻和暖如春瓦糟,著一層夾襖步出監(jiān)牢的瞬間筒愚,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,149評論 1 272
  • 我被黑心中介騙來泰國打工菩浙, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留巢掺,地道東北人。 一個月前我還...
    沈念sama閱讀 48,409評論 3 373
  • 正文 我出身青樓劲蜻,卻偏偏與公主長得像陆淀,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子先嬉,可洞房花燭夜當晚...
    茶點故事閱讀 45,086評論 2 355