GCD-1 Grand Central Dispatch
本文是本人自己辛苦翻譯的,請轉載的朋友註明,翻譯於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_retain和dispatch_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
在主執行緒裡,不能呼叫這個方法。
相關文章
- 讀書筆記【1】 Grand Central Dispatch筆記
- iOS多執行緒程式設計之Grand Central Dispatch(GCD)介紹和使用iOS執行緒程式設計GC
- [編寫高質量iOS程式碼的52個有效方法](十)Grand Central Dispatch(GCD)iOSGC
- swift dispatch 筆記Swift筆記
- 安裝 Dispatch 庫
- GCD使用dispatch_group_notify、dispatch_group_enter、dispatch_group_leave處理多執行緒同步操作GC執行緒
- AtCoder Grand Contest 001
- GCD(三) dispatch_groupGC
- GCD(四) dispatch_semaphoreGC
- 08-dispatch_applyAPP
- MyEclipse - Updating index central|http://central.maven.org/maven2/EclipseIndexHTTPMaven
- Oracle Reporting 2 - Subtotals and Grand TotalOracle
- GCD、dispatch 函式介紹GC函式
- Bad magic number for central directory
- Vue $dispatch 和 $broadcast 詳解VueAST
- dispatch_semaphore網路應用
- GCD-2 Queuing Tasks for DispatchGCUI
- 微軟正式釋出 Azure IoT Central微軟
- I'm shocked that they chose for the City to be the central hub
- 深入理解GCD之dispatch_groupGC
- 深入理解GCD之dispatch_queueGC
- vue store儲存commit 和dispatchVueMIT
- 【 Vue 】 Store 儲存之 dispatch && commitVueMIT
- Pivotal Data Dispatch Pivotal首款ETL工具
- GCD 之快速迭代(dispatch_apply)GCAPP
- AtCoder Grand Contest 010 C - Cleaning
- Central Inventory (oraInventory) - inventory.xml 4AIXML
- Central Inventory (oraInventory) - inventory.xml 3AIXML
- Central Inventory (oraInventory) - inventory.xml 2AIXML
- Central Inventory (oraInventory) - inventory.xml 1AIXML
- Strategies for a Corrupted Oracle Central Inventory [ID 414600.1]Oracle
- dispatch_group控制多個非同步介面非同步
- iOS GCD (四) dispatch_semaphore 訊號量iOSGC
- vue2.0 broadcast和dispatch的理解VueAST
- Running Central Admin on Multiple Servers within a FarmServer
- Oracle的Central Inventory和Local inventory詳解Oracle
- Quest Central for Oracle 5.0.1 官方下載連結Oracle
- GCD中的dispatch_sync、dispatch_sync 分別與序列、並行佇列組合執行小實驗GC並行佇列