Global Central Dispatch

教學連結

優先級: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