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