本文是本人自己辛苦翻譯的,請轉(zhuǎn)載的朋友注明,翻譯于Z.MJun的簡書 ,感謝!<翻譯不容易啊>
完成翻譯于2016年5月17日
Queuing Tasks for Dispatch執(zhí)行隊列任務(wù)的方法
GCD提供和管理FIFO(先進先出)的隊列,應(yīng)用可以提交Block對象任務(wù)。系統(tǒng)會在一個線程池里執(zhí)行和管理被提交Block的調(diào)度隊列。不能保證被制成一個執(zhí)行任務(wù)的線程。GCD提供了三種不同的隊列
-
Main
:任務(wù)都會在應(yīng)用的主線程下串型執(zhí)行。 -
Concurrent
:任務(wù)會在FIFO里按順序排隊,但是,會并發(fā)執(zhí)行,而且完成時順序不一樣。 -
Serial
:任務(wù)會一一在FIFO里按順序執(zhí)行。
系統(tǒng)會自動創(chuàng)建主調(diào)度隊列和關(guān)聯(lián)到應(yīng)用的主線程上。應(yīng)用使用以下三個調(diào)度Block之間的一個,唯一一個來提交到主線程。
- 調(diào)用
dispatch_main
- 調(diào)用
UIApplicationMain (iOS) or NSApplicationMain (OS X)
- 使用
CFRunLoopRef
在主線程。
使用并發(fā)隊列來執(zhí)行龐大的數(shù)字任務(wù)。GCD自動創(chuàng)建4個并行調(diào)度隊列(三個優(yōu)先級于IOS 5 或 OS X v10.7)。這些隊列是應(yīng)用全局的,但優(yōu)先等級不同。應(yīng)用可以通過dispatch_get_global_queue
這個方法調(diào)用他們。因為這些隊列是全局的,所以不需要給他們分配內(nèi)存,而分配內(nèi)存是被忽略的。在OS X v10.7及以上,IOS 4.3及以上,你可以在應(yīng)用里創(chuàng)建新的并行隊列。
在串行隊列里執(zhí)行任務(wù)是被預(yù)測的。這個一個很好的做法,為每個隊列確定一個明確的目的。如保護一個資源或者同步一個關(guān)鍵工程。應(yīng)用必須明確的創(chuàng)建和管理串行隊列。這是很有必要的,但是要避免把他們當(dāng)成并行隊列來同時執(zhí)行任務(wù)。
Important
GCD是基于C的API,他不像一些高級語言一樣能捕捉異常。應(yīng)用必須在使用調(diào)度前確保沒有任何異常出現(xiàn)。
本文是本人自己辛苦翻譯的,請轉(zhuǎn)載的朋友注明,翻譯于Z.MJun的CSDN的博客 http://blog.csdn.net/Zheng_Paul,感謝!
完成翻譯于2016年5月17日
異步事件 dispatch_async
- 描述:在一個隊列里異步執(zhí)行任務(wù),并從Block返回結(jié)果。
- 方法:
void dispatch_async( dispatch_queue_t queue, dispatch_block_t block)
- 參數(shù):
-
queue
提交Block的隊列。隊列被保留,直到功能運行完畢。這個參數(shù)不能為NULL。 -
block
Block提交給目標(biāo)調(diào)度隊列。相應(yīng)會執(zhí)行Block_copy
和Block_release
方法。這個參數(shù)也不能為NULL
-
- 這個方法是提交Block到一個調(diào)度隊列的基本機制。調(diào)用這個方法,總是在Block被提交后馬上返回,并且從不等待Block被調(diào)用。目標(biāo)隊列決定了Block是串行或者并行調(diào)用。獨立的串行隊列相對于彼此并行處理。
異步事件 dispatch_async_f
描述:在一個隊列里異步執(zhí)行一個應(yīng)用默認的方法,并從Block返回結(jié)果。
方法:
void dispatch_async_f( dispatch_queue_t queue, void *context, dispatch_function_t work)
-
參數(shù):
-
queue
提交Block的隊列。隊列被保留,直到功能運行完畢。這個參數(shù)不能為NULL。 -
context
傳遞給work的參數(shù) -
work
系統(tǒng)執(zhí)行的方法。這個參數(shù)不能為NULL。
-
這個方法是使用系統(tǒng)提供的函數(shù)來實現(xiàn)異步調(diào)度。調(diào)用這個方法,Block會馬上返回,并且不會等待事件的執(zhí)行。目標(biāo)隊列決定了Block是串行或者并行調(diào)用。獨立的串行隊列相對于彼此并行處理。
同步事件 dispatch_sync
描述:同步操作,提交一個Block到隊列里,并且等待直到Block處理完畢。
方法:
void dispatch_sync( dispatch_queue_t queue, dispatch_block_t block)
-
參數(shù):
-
queue
提交Block的隊列。這個參數(shù)不能為NULL。 -
block
Block提交給目標(biāo)調(diào)度隊列。這個參數(shù)不能為NULL。
-
同步執(zhí)行隊列。和
dispatch_async
不同的是,這個方法在Block的執(zhí)行完才會返回。相應(yīng)這個方法和當(dāng)前的隊列會進入鎖死模式。
與dispatch_async
不一樣的,block在目標(biāo)函數(shù)上是不會保留。因為這個響應(yīng)是同步執(zhí)行的。另外,這個block不會使用Block_copy
。
作為一個進階,這個方法有時候會在當(dāng)前線程上調(diào)用Block。
同步事件 dispatch_sync_f
- 描述:在一個隊列里同步執(zhí)行一個應(yīng)用默認的方法,并從Block返回結(jié)果。
- 方法:
void dispatch_sync_f( dispatch_queue_t queue, void *context, dispatch_function_t work)
- 參數(shù):
-
queue
提交Block的隊列。隊列被保留,直到功能運行完畢。這個參數(shù)不能為NULL。 -
context
傳遞給work的參數(shù) -
work
系統(tǒng)執(zhí)行的方法。這個參數(shù)不能為NULL。
-
- 類似
dispatch_sync
定時執(zhí)行 dispatch_after
- 描述:特定時間內(nèi)執(zhí)行Block。
- 方法:
void dispatch_after( dispatch_time_t when, dispatch_queue_t queue, dispatch_block_t block)
- 參數(shù):
-
when
這個使用的是dispatch_time
或者dispatch_walltime
類型。 -
queue
傳入帶有Block的隊列,系統(tǒng)會保留這個Block,直到Block被執(zhí)行。這個參數(shù)不能為NULL。 -
block
執(zhí)行的Block。這個功能會執(zhí)行一個Block_copy
和Block_release
。(因為被保留了,使用完要釋放)。這個參數(shù)不能為NULL。
-
- 這個功能是在一個給定的時間后,執(zhí)行傳入隊列里面的Block。
When
參數(shù)你可已使用DISPATCH_TIME_NOW
,但是沒有使用dispatch_async
好。也可以是用自定義的DISPATCH_TIME_FOREVER
。
定時執(zhí)行 dispatch_after_f
- 描述:特定時間內(nèi)執(zhí)行系統(tǒng)提供的函數(shù)。
- 方法:
void dispatch_after_f( dispatch_time_t when, dispatch_queue_t queue, void *context, dispatch_function_t work)
- 參數(shù):
-
when
這個使用的是dispatch_time
或者dispatch_walltime
類型。 -
queue
傳入帶有Block的隊列,系統(tǒng)會保留這個Block,直到Block被執(zhí)行。這個參數(shù)不能為NULL。 -
context
傳給系統(tǒng)提供的函數(shù)的參數(shù) -
work
目標(biāo)隊列會執(zhí)行的系統(tǒng)默認函數(shù)。context
是這個函數(shù)的參數(shù)。這個參數(shù)不能為NULL。 - 這個功能是在一個給定的時間后,執(zhí)行系統(tǒng)的默認函數(shù)
work
。
-
- 這個功能是在一個給定的時間后,執(zhí)行傳入隊列里面的Block。
When
參數(shù)你可已使用DISPATCH_TIME_NOW
,但是沒有使用dispatch_async
好。也可以是用自定義的DISPATCH_TIME_FOREVER
。
多次調(diào)用 dispatch_apply
- 描述:多次調(diào)用傳入調(diào)度隊列的Block。
- 方法:
void dispatch_apply( size_t iterations, dispatch_queue_t queue, void (^block)( size_t))
- 參數(shù):
-
iterations
執(zhí)行次數(shù)。 -
queue
傳入帶有Block的隊列。這個參數(shù)不能為NULL。 -
block
傳入的指定類型的Block。這個參數(shù)不能為NULL。
-
- 這個功能是多次執(zhí)行一個Block,直到執(zhí)行次數(shù)完畢后才會返回。如果這個目標(biāo)隊列是
dispatch_get_global_queue
的并行隊列 ,這個Block可以被同時調(diào)用。并且這Block必須是 reentrant-safe(安全)的。在并行隊列中使用這個方法就相當(dāng)于使用一個有效的并行循環(huán)。
多次調(diào)用 dispatch_apply_f
- 描述:多次調(diào)用傳入調(diào)度隊列的系統(tǒng)默認方法。
- 方法:
void dispatch_apply_f( size_t iterations, dispatch_queue_t queue, void *context, void (*work)(void *, size_t))
- 參數(shù):
-
iterations
執(zhí)行次數(shù)。 -
queue
傳入帶有Block的隊列。這個參數(shù)不能為NULL。-
context
傳給系統(tǒng)提供的函數(shù)的參數(shù)
-
-
work
目標(biāo)隊列會執(zhí)行的系統(tǒng)默認函數(shù)。第一個傳入函數(shù)的參數(shù)是context
,第二個是iterations
。 這個參數(shù)不能為NULL。
-
- 這個功能是多次執(zhí)行一個系統(tǒng)默認函數(shù),直到執(zhí)行次數(shù)完畢后才會返回。如果這個目標(biāo)隊列是
dispatch_get_global_queue
的并行隊列 ,這個Block可以被同時調(diào)用。并且這Block必須是 reentrant-safe(安全)的。在并行隊列中使用這個方法就相當(dāng)于使用一個有效的并行循環(huán)。
一次調(diào)用 dispatch_once
- 描述:在函數(shù)周期里面只會唯一的調(diào)用一次。
- 方法:
void dispatch_once( dispatch_once_t *predicate, dispatch_block_t block)
- 參數(shù):
-
predicate
傳入一個dispatch_once_t
結(jié)構(gòu)體,來判斷這個Block是否執(zhí)行完畢。 -
block
只會執(zhí)行一次的Block。
-
- 這個功能比較適合使用在單例上。在使用這個方法先,總是會在Block里面嘗試是否能使用初始化。
- 如果多個線程同時響應(yīng)他,這個方法會同步執(zhí)行,直到Block完成。
- 這個聲明必須使用在全局變量或者靜態(tài)變量。如果使用在自動或者動態(tài)存儲下,包括OBJ-C的實例變量,都是不定義的。
一次調(diào)用 dispatch_once
- 描述:在函數(shù)周期里面只會唯一的調(diào)用一次。
- 方法:
void dispatch_once_f( dispatch_once_t *predicate, void *context, dispatch_function_t function)
- 參數(shù):
-
predicate
傳入一個dispatch_once_t
結(jié)構(gòu)體,來判斷這個Block是否執(zhí)行完畢。 -
context
通過function
傳入的參數(shù)。 -
function
目標(biāo)隊列會執(zhí)行的系統(tǒng)默認函數(shù)。傳入函數(shù)的參數(shù)是context
。 這個參數(shù)不能為NULL。
。
-
- 這個功能比較適合使用在單例上。在使用這個方法先,總是會在Block里面嘗試是否能使用初始化。
- 如果多個線程同時響應(yīng)他,這個方法會同步執(zhí)行,直到Block完成。
- 這個聲明必須使用在全局變量或者靜態(tài)變量。如果使用在自動或者動態(tài)存儲下,包括OBJ-C的實例變量,都是不定義的。