GCD-1 Grand Central Dispatch

weixin_34321977發表於2016-08-21

本文是本人自己辛苦翻譯的,請轉載的朋友註明,翻譯於Z.MJun的簡書 ,感謝!<翻譯不容易啊>


翻譯於2016年5月12日


Grand Central Dispatch (GCD)

Grand Central Dispatch(GCD)包含語言特徵,一些執行庫,和 提供了全面的系統升級,和全新的改良的執行程式碼可以使用在IOS和OSX的硬體上。

BSD子系統,基礎程式碼和Cocoa的APIs的擴張,更好的讓系統和你的應用跑的更快,更有效率和提高了應答速度。一個應用要有效的使用多核是很困難的,更不用說,使用在不同數量的核心的硬體,或者許多程式在這些核心裡面運作。GCD,是運作在系統底層,可以更好運作所有需要執行的應用,和平衡分配系統可使用資源。

這個文件描述了GCD的API,支援能在Unix系統等級下的非同步操作。你可以使用API管理,檔案描述,埠,通道和時間等介面。在OSX v10.7及以上的系統,你同樣可以使用GCD在檔案描述器上使用通用的非同步I/O操作。

GCD不侷限於使用在系統級的應用,但是在你要使用到更高層級(UI)的應用上的話,你需要考慮在Cocoa上已經提供了相似並且比較容易使用的Object,如:NSOperation,和block boject. 或者其他你能使用的Object。更多諮詢在Concurrency Programming Guide

Important:

當同時使用GCD和fork 系統回撥時,要特別注意。當一個程式使用了GCD回撥之前回撥fork,在子程式中直到成功呼叫exec或者相關功能後在使用額外GCD回撥是非常不安全的做法。


GCD物件和ARC自動釋放機制

當你的應用是基於OBJ-C的,所有的排程物件都是OBJ-C的。例如,當應用使用的是ARC,排程物件的記憶體分配機制和其他的OBJ-C物件一樣。如果不是使用ARC的,需要使用dispatch_retaindispatch_release方法來管理排程物件,而不是使用基礎程式碼的 retain 和 release 方法
如果你需要在使用了ARC的應用下使用retain/release語法(為了保持程式碼的相容性),你可以在 編譯器標示 裡面,使用DOS_OBJECT_USE_OBJC=0,來禁止使用基於OBJ-C的排程。

本文是本人自己辛苦翻譯的,請轉載的朋友註明,翻譯於Z.MJun的CSDN的部落格 http://blog.csdn.net/Zheng_Paul,感謝!


翻譯於2016年5月12日


Grand Central Dispatch (GCD) 功能方法

建立和管理佇列(Queues)

主執行緒 dispatch_get_main_queue

  • 描述:返回在應用的排程佇列中的主執行緒
  • 方法:dispatch_get_main_queue(void)
  • 返回:dispatch_queue_t 型別。 返回主執行緒,這個佇列是自動在Main函式呼叫前自動建立並代表主前程的
  • 系統會自動建立主排程佇列和關聯到應用的主執行緒上。應用使用以下三個排程塊之間的一個,唯一一個來提交到主執行緒。
    • 呼叫 dispatch_main
    • 呼叫UIApplicationMain (iOS) or NSApplicationMain (OS X)
    • 使用 CFRunLoopRef在主執行緒。

作為全域性使用的佇列,在使用這個方法返回佇列時,呼叫dispatch_suspend, dispatch_resume, dispatch_set_context,這個幾個方法是沒有任何效果的。

全域性佇列 dispatch_get_global_queue

  • 描述:通過傳入不同的佇列等級,來獲取系統的全域性佇列
  • 方法:dispatch_get_global_queue( long identifier, unsigned long flags);
  • 引數:
    • identifier 通過不同的服務優先等級,系統返回任務佇列。處理使用者互動和使用者啟動任務佇列要比後臺執行的佇列的優先順序高。有以下dispatch_queue_priority_t
      • DISPATCH_QUEUE_PRIORITY_HIGH 最高等級佇列,佇列優先於Default,和Low
      • DISPATCH_QUEUE_PRIORITY_DEFAULT 標準等級佇列,佇列優先於Low,低於最高等級High
      • DISPATCH_QUEUE_PRIORITY_LOW 低等級佇列,隊裡低於標準Default,和高等級High
      • DISPATCH_QUEUE_PRIORITY_BACKGROUND 後臺等級佇列,這個佇列排程執行於所有的高優先等級佇列和系統執行的高於後臺優先等級佇列的執行緒之後使用。這樣的執行緒優先等級最低,任何磁碟I / O被節流,以儘量減少系統的影響。
    • flags 標記以保留以供使用。一般情況下使用 0。
  • 返回:dispatch_queue_t 型別。全域性佇列
  • 這個方法是更具不同的優先等級返回不同的排程全域性佇列。同樣,在這個調下,呼叫dispatch_suspend, dispatch_resume, dispatch_set_context,這個幾個方法是沒有任何效果的

任務提交到佇列裡都是並行運作的。

建立佇列 dispatch_queue_create

  • 描述:建立一個新的帶Blcokf返回的佇列
  • 方法:dispatch_queue_t dispatch_queue_create( const char *label dispatch_queue_attr_t attr);
  • 引數:
    • label 在除錯工具中,一個字串的唯一ID標記佇列,如儀器儀表,取樣,堆疊鏡頭和崩潰報告。因為應用,庫和架構(frameworks)都可以建立自己排程佇列,一個反向DNS的命名方式。如com.example.myqueue。這個引數是選填的,也可以填寫NULL。
    • attr 在OS X v10.7及以上,IOS4.3及以上,指定DISPATCH_QUEUE_SERIAL或者為NULL來建立序列佇列,指定DISPATCH_QUEUE_CONCURRENT來建立一個並行佇列。在以前的版本,你必須為這個引數制定NULL。型別Dispatch Queue Types
      • DISPATCH_QUEUE_SERIAL 一個排程佇列按順序執行FIFO塊
      • DISPATCH_QUEUE_CONCURRENT 一個排程佇列並列執行塊,雖然他們同事執行塊,但是可以在佇列裡設定同步點來建立塊。
  • 返回:一個全新的排程佇列
  • 在塊提交後,順序佇列按順序一一執行任務。需要注意的是,這個快被提交給獨立的佇列有可能被併發執行。塊被提交給併發佇列脫離了FIFO,單也有可能當資源能充足的條件下被執行。

當前佇列 dispatch_get_current_queue

  • 描述:返回一個正在正式塊的佇列
  • 方法:dispatch_get_current_queue( void)
  • 返回:放回當前佇列
  • 這個方法的範圍會不可能為NULL。當通過外面的塊來響應並且響應在主執行緒呼叫,這個方法會從主執行緒返回。如果響應的是在其他執行緒,那麼這個方法將會返回其他執行佇列。
  • 這個方法適用於:OS X v10.6--v10.9 IOS v4.0--v6.0

佇列屬性 dispatch_queue_attr_make_with_qos_class

  • 描述:通過傳入指定的引數,返回佇列的屬性
  • 方法 dispatch_queue_attr_make_with_qos_class( dispatch_queue_attr_t attr, int qos_class, int relative_priority);
  • 引數:
    • attr NULL或者DISPATCH_QUEUE_SERIAL返回序列佇列,DISPATCH_QUEUE_CONCURRENT則是並行佇列。
    • qos_class 傳入不同的優先順序,如dispatch_queue_priority_t,但是在應用上,有所不一樣,輸入值為qos_class_t
      • QOS_CLASS_USER_INTERACTIVE
      • QOS_CLASS_USER_INITIATED對應DISPATCH_QUEUE_PRIORITY_HIGH
      • QOS_CLASS_DEFAULT對應DISPATCH_QUEUE_PRIORITY_DEFAULT
      • QOS_CLASS_UTILITY對應DISPATCH_QUEUE_PRIORITY_LOW
      • QOS_CLASS_BACKGROUND對用DISPATCH_QUEUE_PRIORITY_BACKGROUND
      • QOS_CLASS_UNSPECIFIED
    • relative_priority 負偏移值。這裡填寫的必須是一個小於0和大於MIN_QOS_CLASS_PRIORITY的數值。
  • 返回:dispatch_queue_attr_t型別,返回屬性有可能是通過dispatch_queue_create這個方法建立的排程佇列。
  • 當你想建立一個具有服務等級質量的排程佇列之前呼叫這個方法。這個方法與你傳入的引數來返回一個你能呼叫dispatch_queue_create方法的值。The quality-of-service value you specify using this function takes precedence over the priority level inherited from the dispatch queue’s target queue.
  • 這個方法適用於:OS X v10.7 IOS v8.0

佇列標識 dispatch_queue_get_label

  • 描述:返回已經被建立的佇列的標識
  • 方法:const char * dispatch_queue_get_label(dispatch_queue_t queue)
  • 引數:queue 佇列不能為空
  • 返回:佇列的標識,如果佇列的標識是NULL,返回也會是NULL。

目標佇列dispatch_set_target_queue

  • 描述:為提供的object設定目標佇列

  • 方法:void dispatch_set_target_queue( dispatch_object_t object, dispatch_queue_t queue)

  • 引數:

    • object 要修改的物件,物件不能為NULL
    • queue 為物件設定佇列目標。這個佇列會被保留,並且如果存在前一個,前一個會被釋放。這個引數不能為NULL。
  • 一個物件的目標佇列處理一個物件,這個目標佇列決定了這個佇列呼叫哪個物件的finalizer。另外,修改某些物件的目標佇列,改變物件的行為。

    • 排程佇列,一個排程佇列的優先繼承於目標佇列。使用dispatch_get_global_queue這個方法獲得一個 你期望的目標佇列。如果你提交一個塊到序列佇列和這個序列隊裡的目標佇列是不同於其他序列佇列。那麼這個塊將不會併發呼叫,或者其他佇列也有相同的目標佇列。

    Important

    如果你為一個佇列修改目標佇列,你必須保證不會在佇列裡產生死迴圈。

    • 排程資源,用來控制或者取消被提交的塊的控制
    • 排程I/O渠道,用來執行I/O操作。這可能影響I/O操作的結構的優先度。例如,如果目標佇列的優先順序別設定成DISPATCH_QUEUE_PRIORITY_BACKGROUND,那麼他的I/O操作在I/O連線後,通過Using the Dispatch I/O Convenience API執行。
      • dispatch_read
      • dispatch_write

主排程dispatch_main

  • 描述:執行提交給主排程的塊
  • 方法:void dispatch_main( void);
  • 返回:沒有返回
  • 這個方法在主執行緒裡,和等待塊提交給主執行緒。應用呼叫UIApplicationMain (iOS), NSApplicationMain (OS X), or CFRunLoopRun在主執行緒裡,不能呼叫這個方法。

相關文章