GCD-2 Queuing Tasks for Dispatch

本文是本人自己辛苦翻譯的,請轉(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_copyBlock_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_copyBlock_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的實例變量,都是不定義的。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

推薦閱讀更多精彩內(nèi)容