RunLoop相關

1. 概念

  • RunLoop是經過內部維護的事件循環來對事件/消息進行管理的一個對象
  • 事件循環
    • 沒有消息須要處理時,休眠以免資源佔用
    • 有消息須要處理時,馬上被喚醒

2. 數據結構

  • CFRunLoop數據結構

    • CoreFoundation 框架
    • 開源
    • CFRunLoop
      • pthread —— 與線程一一對應
      • currentMode —— CFRunLoopMode
      • modes —— NSMutableSet<CFRunLoopMode*>
      • currentModes —— NSMutableSet<NSString*>
      • currentModeItems —— 由多個Source/Timer/Observer組成的集合
    • CFRunLoopMode
      • name
        • NSDefaultRunLoopMode等
      • sources0
        • MutableSet
        • 須要手動喚醒線程
      • sources1
        • MutableSet
        • 具有喚醒線程的能力
      • obverses
        • MutableArray
      • timers
        • MutableArray
    • Source
    • Timer
      • CFRunLoopTimer —— 和NSTimer是toll-free bridged的
    • Observer
      • CFRunLoopObeserver
      • 觀測時間點
        • kCFRunLoopEntry
        • kCFRunLoopBeforeTimers
        • kCFRunLoopBeforeSources
        • kCFRunLoopBeforeWaiting —— 即將從用戶態切換到內核態
        • kCFRunLoopAfterWaiting —— 從內核態切換到了用戶態
        • kCFRunLoopExit
    • 對應關係
  • NSRunLoop多線程

    • Foundation框架
    • 是對CFRunLoop的封裝,提供了面向對象的API
    • CommonMode
      • NSRunLoopCommonModes
      • CommonMode不是實際存在的
      • 是同步Source/Timer/Observer到多個Mode中的一種技術方案

3. 事件循環機制

4. RunLoop與NSTimer

  • 列表滑動時timer的工做

5. RunLoop與多線程

  • 關係
    • 線程和RunLoop是一一對應的
    • 線程默認是沒有RunLoop的,第一次獲取時建立
  • 實現常駐線程
    1. 爲當前線程開啓一個RunLoop
    2. 向RunLoop中添加一個Port/Source等維持RunLoop的事件循環
    3. 啓動RunLoop
相關文章
相關標籤/搜索