Global Central Dispatch
教學連結
使用 DispatchWorkItem 進行可取消任務的延遲工作
使用 DispatchGroup 進行分組或者鏈接任務
使用 DispatchSemaphore 等待異步任務
serial、concurrent 是針對在同一個 queue 內的 Task 產生效果
serial:Task 會依序執行
concurrent:Task 不會依序執行
sync、async 是針對 queue 產生的效果
sync:queue 依照前後順序執行
async:queue 不會依照前後順序執行
優先級:DispatchQoS
以前 GCD 的默認隊列優先級有四個:
DISPATCH_QUEUE_PRIORITY_HIGH
DISPATCH_QUEUE_PRIORITY_DEFAULT
DISPATCH_QUEUE_PRIORITY_LOW
DISPATCH_QUEUE_PRIORITY_BACKGROUND
現在改為了 QoSClass 列舉
public enum QoSClass
{
case background
case utility
case `default`
case userInitiated
case userInteractive
case unspecified
public init?(rawValue: qos_class_t)
public var rawValue: qos_class_t { get }
}
現在通常使用 QoS 為以下四種,從上到下優先級依次降低
User Interactive: 和用戶交互相關,比如動畫等等優先級最高。比如用戶連續拖拽的計算
User Initiated: 需要立刻的結果,比如push一個ViewController之前的數據計算
Utility: 可以執行很長時間,再通知用戶結果。比如下載一個文件,給用戶下載進度
Background: 用戶不可見,比如在後台存儲大量數據
semaphore
主要有三個 function
dispatch_semaphore_create : 建立 semaphore 並設定初始 count
dispatch_semaphore_wait : 等待信號,遇到時先將 count - 1。然後若 count < 0 則卡住線程給他等,直到 count >= 0 才放行
dispatch_semaphore_signal : 發送信號,將 count + 1
- (void)theMethod
{
// 1. 建立 semaphore,count = 0
dispatch_semaphore_t mySemaphore = dispatch_semaphore_create(0);
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
// (做耗時的 A)
// 3. 遇到 signal,count = 0
dispatch_semaphore_signal(mySemaphore);
});
// 2. 遇到 wait,count = -1,會一直停在這裡等待 count = 0
// 4. 偵測到 count = 0,放行
dispatch_semaphore_wait(mySemaphore, DISPATCH_TIME_FOREVER);
// (做 B)
}
Last updated
Was this helpful?