一、什麼是RunLoop? RunLoop是運行迴圈,每個Cocoa應用程式都由一個處於阻塞狀態的do/while迴圈驅動,當有事件發生時,就把事件分派給合適的監聽器,如此反覆直到迴圈停止。處理分派的對象就叫做“運行迴圈”。 基本作用:1、保持程式的持續運行 2、處理App中的各種事件(比如觸摸事件 ...
一、什麼是RunLoop?
RunLoop是運行迴圈,每個Cocoa應用程式都由一個處於阻塞狀態的do/while迴圈驅動,當有事件發生時,就把事件分派給合適的監聽器,如此反覆直到迴圈停止。處理分派的對象就叫做“運行迴圈”。
基本作用:1、保持程式的持續運行 2、處理App中的各種事件(比如觸摸事件、定時器事件、Selector事件)3、節省CPU資源,提高程式性能:該做事時做事,該休息時休息。
二、RunLoop的基礎
每條線程都有唯一的一個與之對應的RunLoop對象
主線程的RunLoop已經自動創建好了,子線程的RunLoop需要主動創建
RunLoop在第一次獲取時創建,線上程結束時銷毀。
2.1獲得RunLoop對象
1、Foundation
[NSRunLoop currentRunLoop]; // 獲得當前線程的RunLoop對象
[NSRunLoop mainRunLoop]; // 獲得主線程的RunLoop對象
2、Core Foundation
CFRunLoopGetCurrent(); // 獲得當前線程的RunLoop對象
CFRunLoopGetMain(); // 獲得主線程的RunLoop對象
2.2 Core Foundation中關於RunLoop的5個類
CFRunLoopRef、CFRunLoopModeRef、CFRunLoopSourceRef、CFRunLoopTimerRef、CFRunLoopObserverRef
2.2.1 CFRunLoopModeRef代表RunLoop的運行模式
一個 RunLoop 包含若幹個 Mode,每個Mode又包含若幹個Source/Timer/Observer
每次RunLoop啟動時,只能指定其中一個 Mode,這個Mode被稱作 CurrentMode
如果需要切換Mode,只能退出Loop,再重新指定一個Mode進入
這樣做主要是為了分隔開不同組的Source/Timer/Observer,讓其互不影響
- 系統預設註冊了5個Mode:
- kCFRunLoopDefaultMode:App的預設Mode,通常主線程是在這個Mode下運行
- UITrackingRunLoopMode:界面跟蹤 Mode,用於 ScrollView 追蹤觸摸滑動,保證界面滑動時不受其他 Mode 影響
- UIInitializationRunLoopMode: 在剛啟動 App 時第進入的第一個 Mode,啟動完成後就不再使用
- GSEventReceiveRunLoopMode: 接受系統事件的內部 Mode,通常用不到
- kCFRunLoopCommonModes: 這是一個占位用的Mode,不是一種真正的Mode
2.2.2 CFRunLoopSourceRef是事件源(輸入源)
- 以前的分法
- Port-Based Sources
- Custom Input Sources
- Cocoa Perform Selector Sources
- 現在的分法
- Source0:非基於Port的
- Source1:基於Port的
2.2.3 CFRunLoopTimerRef是基於時間的觸發器
- 基本上說的就是NSTimer
2.2.4 CFRunLoopObserverRef是觀察者,能夠監聽RunLoop的狀態改變
- 可以監聽的時間點有以下幾個
三、RunLoop處理邏輯