iOS RunLoop

概念

  • RunLoop類似于Windows程序的消息循壞,不斷的循環(huán)處理事件消息(定時器事件,用戶交互事件,模態(tài)窗口事件,系統(tǒng)Source事件,自定義Source事件)
  • RunLoop和線程是一一對應(yīng)的,直到在線程中獲取的時候,RunLoop才創(chuàng)建
  • RunLoop包括3大核心組建:定時器,輸入源Input Sources和觀察者Observer

RunLoop的Modes

  • Modes是一組事件類型的集合,每個事件是注冊關(guān)聯(lián)到一個或者多個Mode中,RunLoop在每個時刻運行在一個特定的模式
  • RunLoop在運行時,只注冊到當前模式下的事件和通知模式相關(guān)的觀察者
  • NSDefaultRunLoopMode
  • NSRunLoopCommonModes
  • TrackingRunLoopMode

Observer

* CFRunLoopActivity定義了RunLoop在運行中不同的活動狀態(tài),這些狀態(tài)可以通過觀察者Observer跟蹤

/* Run Loop Observer Activities */
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會注冊對應(yīng)的時間點,當時間點到時,RunLoop會被喚醒以執(zhí)行那個回調(diào)

Input Source

  • 基于Port的Source
  • Perform Selector Sources
  • 自定義Source

RunLoop事件處理流程

RunLoop事件處理流程

  • 通知觀察者即將進入runloop處理
  • 如果存在即將發(fā)生的定時器事件,通知所有的觀察者。
  • 如果存在即將發(fā)生的非port的source事件,在事件發(fā)生前,通知所有的觀察者。
  • 如果存在即將發(fā)生的非port的source事件,在事件發(fā)生后,通知所有的觀察者。
  • 如果存在基于port的事件等待處理,立即處理轉(zhuǎn)9
  • 通知觀察者,線程即將休眠
  • 線程休眠一直等到下面任意事件之一發(fā)生:
    • 基于port的事件發(fā)生
    • 定時器超時
    • runloop設(shè)置的超時時間到期
    • 顯式的喚醒runloop
    • 通知觀察者,線程即將被喚醒
    • 處理等待的事件
      • 如果是定時器事件,執(zhí)行定時器處理函數(shù)重新start runloop, 轉(zhuǎn)2
      • 如果是用戶定義的source 執(zhí)行對應(yīng)的事件處理方法
      • 如果runloop被顯式的喚醒并且沒有超時,重新start runloop, 轉(zhuǎn)2

RunLoop的使用

  • AutoreleasePool
  • 事件響應(yīng)
  • 手勢識別
  • 界面更新
  • 定時器
  • PerformSelector
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

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