《新浪微博剖析 iOS 高級面試》筆記(七):RunLoop相關面試問題

個人Github地址git

小碼哥《戀上數據結構與算法》筆記github

極客時間《iOS開發高手課》筆記面試

iOS大廠面試高頻算法題總結算法

iOS面試資料彙總markdown

概念

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

一、main函數爲何能夠保證不退出?

  • UIApplicationMain啓動主線程的runloop

數據結構

  • CFRunLoop
    • pthread
      • runloop線程是一一對應的
    • currentMode
      • CFRunLoopMode
    • modes
      • NSMutableSet<CFRunLoopMode *>
    • commonModes
      • NSMutableSet<NSString *>
    • commonModelItems
      • NSMutableSet<<Observer, Timer, Source>>
  • CFRunLoopMode
    • name
      • NSDefaultRunLoopMode
    • sources0
      • NSMutableSet
    • sources1
      • NSMutableSet
    • observers
      • NSMutableArray
    • timers
      • NSMutableArray
  • Source/Timer/Observer
    • Source0
      • 當添加事件到Source0,它並不會主動喚醒線程,須要手動喚醒線程。
    • Source1
      • 具有喚醒線程的能力。
    • CFRunLoopTimer
      • 基於事件的定時器,和NSTimer是能夠轉換的。
    • CFRunLoopObserver
      • 觀測時間點
        • kCFRunLoopEntry
        • kCFRunLoopBeforeTimers
        • kCFRunLoopBeforeSources
        • kCFRunLoopBeforeWaiting(用戶態切內核態)
        • kCFRunLoopAfterWaiting(內核態切用戶態)
        • kCFRunLoopExit

一、各個數據結構之間的關係

  • 當在mode1下運行時,只能接收和處理mode1下的sourcesobserverstimers,是沒法接收mode2mode3下的事件回調的。

二、如何將一個Timer同時加入到兩個Mode中?

  • commonMode不是實際存在的一種Mode
  • 是同步Source/Timer/Observer到多個Mode中的一種技術方案。

事件循環機制

一、RunLoop事件循環機制是什麼樣的?

二、如何喚醒休眠的Runloop?

  • Source1
  • Timer事件
  • 外部手動喚醒

RunLoop與NSTimer

一、滑動TableView的時候定時器還會生效嗎?

  • 在滑動時,currentMode會從kCFRunLoopDefaultMode切換到UITrackingRunLoopMode
  • 能夠經過CFRunLoopAddTimer(runLoop,timer,commonMode)函數,將timer添加到commonMode當中。
  • commonMode的做用就是將某一個事件源同步到多個mode當中。

RunLoop與多線程

  • 線程RunLoop是一一對應的。
  • 本身建立的線程默認是沒有RunLoop的。

一、怎樣實現一個常駐線程?

  • 爲當前線程開啓一個RunLoop
  • 向該RunLoop中添加一個Port/Source等維持RunLoop的事件循環。
  • 啓動該RunLoop

RunLoop面試總結

  • 什麼是RunLoop,它是怎樣作到有事作事,沒事休息的?
  • RunLoop與線程是怎樣的關係?
  • 如何實現一個常駐線程
  • 怎樣保證子線程數據回來更新UI的時候不打斷用戶的滑動操做?
    • 子線程拋回給主線程更新UI的邏輯,包裝起來,提交到主線程的kCFRunLoopDefaultMode下。
    • 當前用戶滑動tableView處於UITrackingRunLoopMode模式下就不會執行該邏輯。
    • 當用戶中止滑動以後,當前線程mode切換到kCFRunLoopDefaultMode下,就會處理更新UI的邏輯。
相關文章
相關標籤/搜索