RunLoop

RunLoop

RunPoop是什么

  • 這是毅種循環,而這種循環卻保持著APP程序的持續運行
  • 在這個循環里可以處理APP的各種事件(觸摸事件,定時器事件等)
  • 可以節省CPU資源,提高程序性能,該做事的時候做事,該休息的時候休息。

RunLoop可以持續運行的本質

  • 其實在程序內部有一個dowhile循環保持著這種狀態.

RunLoop對象

  • IOS中有兩種API訪問RunLoop
  • Foundation框架下的NSRunLoop
  • Core Foundation框架下的CFRunLoopRef
  • NSRunLoop和CFRunLoopRef都代表著RunLoop對象
  • 但是NSRunLoop是基于CFRunLoopRef的一層OC重新的包裝,所以想要深入了解RunLoop就必須深入到CFRunLoopRef層面

RunLoop與線程

  • 重要:每個線程其實都有一個唯一與之對應的RunLoop(在底層頭文件中其實線程和RunLoop是存在字典里的,一對一的關系)

  • 主線程的RunLoop是自動創建的,而非主線程的RunLoop則需要自己創建

  • RunLoop在第一次被調用的時候創建.

  • 獲得的RunLoop的方法

  • Foundation

    • [NSRunLoop currentRunLoop]; // 獲得當前線程的RunLoop對象
    • [NSRunLoop mainRunLoop]; // 獲得主線程的RunLoop對象
  • Core Foundation

    • CFRunLoopGetCurrent(); // 獲得當前線程的RunLoop對象
    • CFRunLoopGetMain(); // 獲得主線程的RunLoop對象

CFRunLoopModeRef

  • CFRunLoopModeRef代表RunLoop的運行模式
  • 一個RunLoop包含多個模式,每個模式又包含多個(重要):Timer Source 或者Observe
  • 每次RunLoop啟動時候,只能運行在其中一個mode上,這個mode就是currentmode
  • 如果需要切換mode需要退出RunLoop重新制定mode再進入
  • 這要做主要是為了分隔開不通mode的任務 讓其互相不干擾
  • 系統默認注冊的mode
    • kCFRunLoopDefaultMode:App的默認Mode,主線程是在這個Mode下運行
    • UITrackingRunLoopMode:界面跟蹤Mode,用于 ScrollView 追蹤觸摸滑動保證界面滑動時不受其他Mode影響
    • UIInitializationRunLoopMode: 在剛啟動 App 時第進入的第一個 Mode,啟動完成后就不再使用
    • GSEventReceiveRunLoopMode: 接受系統事件的內部 Mode,通常用不 - kCFRunLoopCommonModes: 這是一個占位用的Mode,不是一種真正的Mode

RunLoop的內部狀態

Snip20150712_3.png

RunLoop的內部狀態切換過程

Snip20150712_2.png
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • Run loop 剖析:Runloop 接收的輸入事件來自兩種不同的源:輸入源(intput source)和定時...
    Mitchell閱讀 12,465評論 17 111
  • 前言 最近離職了,可以盡情熬夜寫點總結,不用擔心第二天上班爽并蛋疼著,這篇的主角 RunLoop 一座大山,涵蓋的...
    zerocc2014閱讀 12,412評論 13 67
  • 如果沒有RunLoop main函數中的RunLoop 第14行代碼的UIApplicationMain函數內部就...
    JonesCxy閱讀 558評論 0 4
  • 一、什么是runloop 字面意思是“消息循環、運行循環”。它不是線程,但它和線程息息相關。一般來講,一個線程一次...
    WeiHing閱讀 8,168評論 11 111
  • 天微亮 在田里走走停停 夏天特有的 綠葉的清香 在空氣中散落 往前走 一片小小的草地 陷在楊樹林的懷抱中 小鳥在樹...
    星刎閱讀 175評論 0 0