Dispatch框架詳細(xì)解析(一) —— 基本概覽

版本記錄

版本號 時間
V1.0 2017.11.04

前言

在app中,在多線程等很多時候都會使用Dispatch。下面我們就詳細(xì)解析一下這個框架的詳細(xì)情況。

Overview

首先看一下該框架的基本信息

下面看一下該框架的基本結(jié)構(gòu)。


Dispatch

通過提交工作來調(diào)度由系統(tǒng)管理的隊列,在多核硬件上同時執(zhí)行代碼。

Grand Central Dispatch(GCD)包含語言功能,運行時庫和系統(tǒng)增強功能,可為macOS,iOS,watchOS和tvOS上的多核硬件上的并發(fā)代碼執(zhí)行支持提供系統(tǒng),全面的改進(jìn)。

BSD子系統(tǒng),Core FoundationCocoa API已經(jīng)全部擴展到使用這些增強功能來幫助系統(tǒng)和應(yīng)用程序更快,更高效地運行并提高響應(yīng)速度。 考慮單個應(yīng)用程序有效地使用多個內(nèi)核是多么的困難,更不用說在具有不同數(shù)量的計算核心的不同計算機上或者在具有多個應(yīng)用程序的環(huán)境中競爭這些內(nèi)核。 在系統(tǒng)級運行的GCD可以更好地適應(yīng)所有正在運行的應(yīng)用程序的需求,并以均衡的方式將它們與可用的系統(tǒng)資源進(jìn)行匹配。


Dispatch 對象和ARC

當(dāng)您使用Objective-C編譯器構(gòu)建應(yīng)用程序時,所有dispatch對象都是Objective-C對象。 因此,啟用自動引用計數(shù)(ARC)時,dispatch對象將被自動保留和釋放,就像任何其他Objective-C對象一樣。 當(dāng)ARC未啟用時,使用dispatch_retain
dispatch_release函數(shù)(或Objective-C語義)來保留并釋放您的調(diào)度對象。 您不能使用Core Foundation retain/release函數(shù)。

如果您需要在啟用了ARC的應(yīng)用程序中使用retain/release語義,并使用更高的部署目標(biāo)(以保持與現(xiàn)有代碼的兼容性),則可以通過將-DOS_OBJECT_USE_OBJC = 0添加到編譯器標(biāo)志來禁用基于Objective-C的dispatch對象。


Dispatch基本概覽

1. Managing Dispatch Queues

GCD提供并管理您的應(yīng)用程序可以以塊對象的形式提交任務(wù)的FIFO隊列。 提交給dispatch隊列的工作在由系統(tǒng)完全管理的線程池上執(zhí)行。 不保證執(zhí)行任務(wù)的線程。

2. Managing Units of Work

調(diào)度Dispatch塊允許您直接配置隊列中各個工作單元的屬性。 他們還允許您為了等待完成,收到通知完成和/或取消它們的目的,處理個別工作單位。

3. Prioritizing Work and Specifying Quality of Service

4. Using Dispatch Groups

分組塊允許聚合同步。 您的應(yīng)用程序可以提交多個塊,并在完成時跟蹤,即使它們可能運行在不同的隊列中。 如果在完成所有指定任務(wù)之后才能進(jìn)行此操作,則此行為會很有幫助。

  • dispatch_group_t

    • 一組塊對象提交到隊列以進(jìn)行異步調(diào)用。
  • dispatch_group_async

    • 將塊提交到調(diào)度隊列,并將塊與指定的調(diào)度組相關(guān)聯(lián)。
  • dispatch_group_async_f

    • 將應(yīng)用程序定義的函數(shù)提交給調(diào)度隊列,并將其與指定的調(diào)度組相關(guān)聯(lián)。
  • dispatch_group_notify_f

    • 當(dāng)一組先前提交的塊對象完成時,安排應(yīng)用程序定義的函數(shù)提交給隊列。
  • dispatch_group_wait

    • 同步等待先前提交的塊對象完成; 如果在指定的超時期限過去之前塊沒有完成,則返回。

5. Using Dispatch Semaphores

調(diào)度信號量是傳統(tǒng)計數(shù)信號量的有效實現(xiàn)。 只有當(dāng)調(diào)用線程需要被阻塞時,調(diào)度信號才會調(diào)用內(nèi)核。 如果調(diào)用信號量不需要阻塞,則不進(jìn)行內(nèi)核調(diào)用。

6. Using Dispatch Barriers

調(diào)度阻塞允許您在并發(fā)調(diào)度隊列中創(chuàng)建同步點。 當(dāng)遇到障礙時,并發(fā)隊列會延遲屏障塊(或任何其他塊)的執(zhí)行,直到在屏障完成執(zhí)行之前提交的所有塊為止。 在這一點上,障礙塊自行執(zhí)行。 完成后,隊列恢復(fù)正常的執(zhí)行行為。

7. Using Dispatch Data

  • Dispatch Data Object Constants

    • 表示數(shù)據(jù)對象的常量
  • Dispatch Data Destructor Constants

    • 表示用于數(shù)據(jù)對象的析構(gòu)函數(shù)的常量。
  • dispatch_data_t

    • 表示內(nèi)存連續(xù)或稀疏區(qū)域的不可變對象。
  • dispatch_data_applier_t

    • 用于調(diào)用數(shù)據(jù)對象中每個連續(xù)內(nèi)存區(qū)域的塊。
  • dispatch_data_create

    • 用指定的內(nèi)存緩沖區(qū)創(chuàng)建一個新的調(diào)度數(shù)據(jù)對象。
  • dispatch_data_get_size

    • 返回由調(diào)度數(shù)據(jù)對象管理的內(nèi)存的邏輯大小
  • dispatch_data_create_map

    • 返回包含指定對象內(nèi)存的連續(xù)表示的新調(diào)度數(shù)據(jù)對象。
  • dispatch_data_create_concat

    • 返回由兩個其他數(shù)據(jù)對象的連接數(shù)據(jù)組成的新的分派數(shù)據(jù)對象。
  • dispatch_data_create_subrange

    • 返回一個新的調(diào)度數(shù)據(jù)對象,其內(nèi)容由另一個對象的內(nèi)存區(qū)域的一部分組成。
  • dispatch_data_apply

    • 遍歷調(diào)度數(shù)據(jù)對象的內(nèi)存,并在每個區(qū)域執(zhí)行自定義代碼。
  • dispatch_data_copy_region

    • 返回包含另一個數(shù)據(jù)對象中的部分?jǐn)?shù)據(jù)的數(shù)據(jù)對象。

8. Using Dispatch Time

9. Managing Dispatch Sources

10. Managing Dispatch I/O

調(diào)度I / O通道API允許您管理基于文件描述符的操作。 該API支持基于流的和隨機訪問語義來訪問文件描述符的內(nèi)容。

11. Working with Dispatch Objects

GCD提供了調(diào)度對象接口,使您的應(yīng)用程序能夠管理諸如內(nèi)存管理,暫停和恢復(fù)執(zhí)行,定義對象上下文以及記錄任務(wù)數(shù)據(jù)等方面的處理。 調(diào)度對象必須手動保留和釋放,而不是垃圾收集。

12. Protocols

13. Reference

后記

未完,待續(xù)~~~

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 一:base.h 二:block.h 1. dispatch_block_flags:DISPATCH_BLOCK...
    小暖風(fēng)閱讀 2,776評論 0 0
  • 1.NSTimer不準(zhǔn)時的原因:(1).RunLoop循環(huán)處理時間,每次循環(huán)是固定時間,只有在這段時間才會去查看N...
    稻春閱讀 1,362評論 0 3
  • Execute code concurrently on multicore hardware by submit...
    ngugg閱讀 748評論 0 1
  • GCD筆記 總結(jié)一下多線程部分,最強大的無疑是GCD,那么先從這一塊部分講起. Dispatch Queue的種類...
    jins_1990閱讀 836評論 0 1
  • Dispatch Sources 現(xiàn)代系統(tǒng)通常提供異步接口,允許應(yīng)用向系統(tǒng)提交請求,然后在系統(tǒng)處理請求時應(yīng)用可以繼...
    YangPu閱讀 386評論 0 0

友情鏈接更多精彩內(nèi)容