版本記錄
| 版本號 | 時間 |
|---|---|
| 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 Foundation和Cocoa 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ù)的線程。
-
- 創(chuàng)建新的dispatch隊列時使用的屬性。
-
Dispatch Queue Label Constants
- dispatch_queue_get_label函數(shù)的常數(shù)。
-
- 一個dispatch隊列是一個輕量級的對象,應(yīng)用程序為了后續(xù)執(zhí)行而提交塊。
-
- 返回主線程關(guān)聯(lián)的串行dispatch隊列。
-
- 根據(jù)指定的服務(wù)類的質(zhì)量,返回一個系統(tǒng)定義的全局并發(fā)隊列。
-
- 返回當(dāng)前block正在運行的隊列。
-
- 為給定的對象設(shè)置目標(biāo)隊列。
-
- 為在dispatch隊列中異步執(zhí)行提交一個block,并立即返回。
-
- 在調(diào)度隊列中提交應(yīng)用程序定義的異步執(zhí)行函數(shù),并立即返回。
-
- 提交應(yīng)用程序定義的函數(shù),用于在調(diào)度隊列上同步執(zhí)行。
-
- 在指定的時間排隊執(zhí)行block。
-
- 在指定的時間排隊一個應(yīng)用程序定義的函數(shù)以供執(zhí)行。
-
- 將一個應(yīng)用程序定義的函數(shù)提交給調(diào)度隊列以進(jìn)行多個調(diào)用。
-
- 返回創(chuàng)建隊列時為隊列指定的標(biāo)簽。
-
- 返回與當(dāng)前分派隊列關(guān)聯(lián)的鍵的值。
-
- 設(shè)置指定調(diào)度隊列的鍵/值數(shù)據(jù)。
-
- 獲取與指定調(diào)度隊列關(guān)聯(lián)的鍵的值。
-
- 用于dispatch_once函數(shù)的謂詞。
-
- 在應(yīng)用程序的整個生命周期中,一次且只能執(zhí)行一次塊對象。
-
- 在應(yīng)用程序的整個生命周期中,只執(zhí)行一次應(yīng)用程序定義的函數(shù)。
-
- 執(zhí)行提供給主隊列的塊。
2. Managing Units of Work
調(diào)度Dispatch塊允許您直接配置隊列中各個工作單元的屬性。 他們還允許您為了等待完成,收到通知完成和/或取消它們的目的,處理個別工作單位。
-
- 提交給調(diào)度隊列的塊原型,不帶任何參數(shù),沒有返回值。
-
- 提交給調(diào)度隊列的函數(shù)原型。
-
- 使用現(xiàn)有的塊和給定的標(biāo)志在堆上創(chuàng)建新的分派塊。
-
dispatch_block_create_with_qos_class
- 在現(xiàn)有塊和給定標(biāo)志的堆上創(chuàng)建一個新的調(diào)度塊,并為其指定QoS等級和相對優(yōu)先級。
-
- 創(chuàng)建,同步執(zhí)行,并從指定的塊和標(biāo)志釋放調(diào)度塊。
-
- 同步等待,直到指定的調(diào)度塊的執(zhí)行完成,或者直到超過指定的超時時間。
-
- 當(dāng)指定的調(diào)度塊的執(zhí)行完成時,安排通知塊被提交給隊列。
-
- 異步取消指定的分派塊。
-
- 測試給定的調(diào)度塊是否被取消。
-
- 傳遞給dispatch_block_create和dispatch_block_create_with_qos_class函數(shù)的標(biāo)志位。
3. Prioritizing Work and Specifying Quality of Service
-
- 用于選擇合適的全局并發(fā)隊列。
-
dispatch_queue_attr_make_with_qos_class
- 返回適合于創(chuàng)建具有所需服務(wù)質(zhì)量信息的調(diào)度隊列的屬性。
4. Using Dispatch Groups
分組塊允許聚合同步。 您的應(yīng)用程序可以提交多個塊,并在完成時跟蹤,即使它們可能運行在不同的隊列中。 如果在完成所有指定任務(wù)之后才能進(jìn)行此操作,則此行為會很有幫助。
-
- 一組塊對象提交到隊列以進(jìn)行異步調(diào)用。
-
- 將塊提交到調(diào)度隊列,并將塊與指定的調(diào)度組相關(guān)聯(lián)。
-
- 將應(yīng)用程序定義的函數(shù)提交給調(diào)度隊列,并將其與指定的調(diào)度組相關(guān)聯(lián)。
-
- 當(dāng)一組先前提交的塊對象完成時,安排應(yīng)用程序定義的函數(shù)提交給隊列。
-
- 同步等待先前提交的塊對象完成; 如果在指定的超時期限過去之前塊沒有完成,則返回。
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í)行行為。
-
- 為異步執(zhí)行提交barrier塊并立即返回。
-
- 提交異步執(zhí)行的barrier函數(shù)并立即返回。
-
- 提交barrier塊對象執(zhí)行,并等待該塊完成。
-
- 提交執(zhí)行的barrier函數(shù),并等待該函數(shù)完成。
7. Using Dispatch Data
-
Dispatch Data Object Constants
- 表示數(shù)據(jù)對象的常量
-
Dispatch Data Destructor Constants
- 表示用于數(shù)據(jù)對象的析構(gòu)函數(shù)的常量。
-
- 表示內(nèi)存連續(xù)或稀疏區(qū)域的不可變對象。
-
- 用于調(diào)用數(shù)據(jù)對象中每個連續(xù)內(nèi)存區(qū)域的塊。
-
- 用指定的內(nèi)存緩沖區(qū)創(chuàng)建一個新的調(diào)度數(shù)據(jù)對象。
-
- 返回由調(diào)度數(shù)據(jù)對象管理的內(nèi)存的邏輯大小
-
- 返回包含指定對象內(nèi)存的連續(xù)表示的新調(diào)度數(shù)據(jù)對象。
-
- 返回由兩個其他數(shù)據(jù)對象的連接數(shù)據(jù)組成的新的分派數(shù)據(jù)對象。
-
- 返回一個新的調(diào)度數(shù)據(jù)對象,其內(nèi)容由另一個對象的內(nèi)存區(qū)域的一部分組成。
-
- 遍歷調(diào)度數(shù)據(jù)對象的內(nèi)存,并在每個區(qū)域執(zhí)行自定義代碼。
-
- 返回包含另一個數(shù)據(jù)對象中的部分?jǐn)?shù)據(jù)的數(shù)據(jù)對象。
8. Using Dispatch Time
-
- 基本時間常數(shù)。
-
Dispatch Time Multiplier Constants
- 用于計算時間值的乘數(shù)。
-
- 一個有點抽象的時間表示。
-
- 創(chuàng)建相對于默認(rèn)時鐘的
dispatch_time_t或修改現(xiàn)有的dispatch_function_t。
- 創(chuàng)建相對于默認(rèn)時鐘的
-
- 根據(jù)wall鐘創(chuàng)建使用絕對時間的
dispatch_function_t。
- 根據(jù)wall鐘創(chuàng)建使用絕對時間的
9. Managing Dispatch Sources
-
- 定義與所有分派源類型共享的一組公共屬性和方法。
-
Dispatch Source Type Constants
- dispatch sources的類型。
-
Dispatch Source Mach Send Event Flags
- Mach發(fā)送事件標(biāo)志。
-
Dispatch Source Process Event Flags
- 過程事件標(biāo)志位。
-
Dispatch Source Vnode Event Flags
- 文件系統(tǒng)對象事件標(biāo)志位。
-
Dispatch Source Memory Pressure Event Flags
- 內(nèi)存壓力事件標(biāo)志位。
-
- 由調(diào)度源監(jiān)視的類型系統(tǒng)對象的標(biāo)識符。
-
- 用于I/O操作的文件描述符。
-
- 創(chuàng)建一個新的調(diào)度源來監(jiān)視低級系統(tǒng)對象,并自動提交一個處理程序塊到調(diào)度隊列以響應(yīng)事件。
-
- 返回調(diào)度源的待處理數(shù)據(jù)。
-
- 返回與指定調(diào)度源關(guān)聯(lián)的底層系統(tǒng)句柄。
-
- 返回調(diào)度源監(jiān)視的事件的掩碼。
-
- 將數(shù)據(jù)合并到類型為
DISPATCH_SOURCE_TYPE_DATA_ADD或DISPATCH_SOURCE_TYPE_DATA_OR的調(diào)度源中,并將其事件處理程序塊提交給其目標(biāo)隊列。
- 將數(shù)據(jù)合并到類型為
-
- 為定時器源設(shè)置開始時間,間隔和余量值。
-
dispatch_source_set_registration_handler
- 為給定的調(diào)度源設(shè)置注冊處理程序塊。
-
dispatch_source_set_registration_handler_f
- 為給定的調(diào)度源設(shè)置注冊處理函數(shù)。
-
dispatch_source_set_event_handler
- 為給定的調(diào)度源設(shè)置事件處理程序塊。
-
dispatch_source_set_event_handler_f
- 為給定的調(diào)度源設(shè)置事件處理函數(shù)。
-
dispatch_source_set_cancel_handler
- 為給定的調(diào)度源設(shè)置取消處理程序塊。
-
dispatch_source_set_cancel_handler_f
- 為給定的調(diào)度源設(shè)置取消處理函數(shù)
-
- 異步取消調(diào)度源,阻止任何進(jìn)一步的調(diào)用其事件處理程序塊。
-
- 測試給定的調(diào)度源是否被取消。
10. Managing Dispatch I/O
調(diào)度I / O通道API允許您管理基于文件描述符的操作。 該API支持基于流的和隨機訪問語義來訪問文件描述符的內(nèi)容。
-
- 可能創(chuàng)建的調(diào)度I / O通道的類型。
-
Dispatch I/O Channel Closing Options
- 關(guān)閉調(diào)度I / O通道時使用的選項。
-
Dispatch I/O Channel Configuration Options
- 配置通道時使用的選項。
-
- 一個
dispatch I/O通道
- 一個
-
- dispatch I/O 通道類型。
-
- 處理程序塊用于處理調(diào)度I / O通道上的操作。
-
- 將指定的通道關(guān)閉到新的讀取和寫入操作。
-
- 用于指定通道關(guān)閉選項的標(biāo)志類型。
-
- 設(shè)置調(diào)用通道的I / O處理程序的間隔(以納秒為單位)。
-
- 用于指定通道調(diào)度間隔的標(biāo)志類型。
11. Working with Dispatch Objects
GCD提供了調(diào)度對象接口,使您的應(yīng)用程序能夠管理諸如內(nèi)存管理,暫停和恢復(fù)執(zhí)行,定義對象上下文以及記錄任務(wù)數(shù)據(jù)等方面的處理。 調(diào)度對象必須手動保留和釋放,而不是垃圾收集。
-
- 激活調(diào)度對象。
-
- 遞增調(diào)度對象的引用(保留)計數(shù)。
-
- 減少調(diào)度對象的引用(保留)計數(shù)。
-
- 返回對象的應(yīng)用程序定義的上下文。
-
- 將應(yīng)用程序定義的上下文與對象關(guān)聯(lián)。
-
- 設(shè)置調(diào)度對象的終結(jié)器函數(shù)。
12. Protocols
13. Reference
后記
未完,待續(xù)~~~
