版本記錄
版本號 | 時間 |
---|---|
V1.0 | 2017.11.04 |
前言
在app中侠讯,在多線程等很多時候都會使用
Dispatch
倦始。下面我們就詳細解析一下這個框架的詳細情況驰坊。
Overview
首先看一下該框架的基本信息
下面看一下該框架的基本結構谊迄。
Dispatch
通過提交工作來調度由系統(tǒng)管理的隊列惩琉,在多核硬件上同時執(zhí)行代碼豆励。
Grand Central Dispatch(GCD)
包含語言功能,運行時庫和系統(tǒng)增強功能瞒渠,可為macOS良蒸,iOS技扼,watchOS和tvOS上的多核硬件上的并發(fā)代碼執(zhí)行支持提供系統(tǒng),全面的改進嫩痰。
BSD
子系統(tǒng)淮摔,Core Foundation
和Cocoa API
已經(jīng)全部擴展到使用這些增強功能來幫助系統(tǒng)和應用程序更快,更高效地運行并提高響應速度始赎。 考慮單個應用程序有效地使用多個內核是多么的困難,更不用說在具有不同數(shù)量的計算核心的不同計算機上或者在具有多個應用程序的環(huán)境中競爭這些內核仔燕。 在系統(tǒng)級運行的GCD可以更好地適應所有正在運行的應用程序的需求造垛,并以均衡的方式將它們與可用的系統(tǒng)資源進行匹配。
Dispatch 對象和ARC
當您使用Objective-C編譯器構建應用程序時晰搀,所有dispatch
對象都是Objective-C對象五辽。 因此,啟用自動引用計數(shù)(ARC)時外恕,dispatch
對象將被自動保留和釋放杆逗,就像任何其他Objective-C對象一樣。 當ARC未啟用時鳞疲,使用dispatch_retain
和dispatch_release函數(shù)(或Objective-C語義)來保留并釋放您的調度對象罪郊。 您不能使用Core Foundation retain/release
函數(shù)。
如果您需要在啟用了ARC的應用程序中使用retain/release
語義尚洽,并使用更高的部署目標(以保持與現(xiàn)有代碼的兼容性)悔橄,則可以通過將-DOS_OBJECT_USE_OBJC = 0
添加到編譯器標志來禁用基于Objective-C的dispatch對象。
Dispatch基本概覽
1. Managing Dispatch Queues
GCD提供并管理您的應用程序可以以塊對象的形式提交任務的FIFO隊列腺毫。 提交給dispatch隊列的工作在由系統(tǒng)完全管理的線程池上執(zhí)行癣疟。 不保證執(zhí)行任務的線程。
-
- 創(chuàng)建新的dispatch隊列時使用的屬性潮酒。
-
Dispatch Queue Label Constants
- dispatch_queue_get_label函數(shù)的常數(shù)睛挚。
-
- 一個dispatch隊列是一個輕量級的對象,應用程序為了后續(xù)執(zhí)行而提交塊急黎。
-
- 返回主線程關聯(lián)的串行dispatch隊列扎狱。
-
- 根據(jù)指定的服務類的質量,返回一個系統(tǒng)定義的全局并發(fā)隊列叁熔。
-
- 返回當前block正在運行的隊列委乌。
-
- 為給定的對象設置目標隊列。
-
- 為在dispatch隊列中異步執(zhí)行提交一個block荣回,并立即返回遭贸。
-
- 在調度隊列中提交應用程序定義的異步執(zhí)行函數(shù),并立即返回心软。
-
- 提交應用程序定義的函數(shù)壕吹,用于在調度隊列上同步執(zhí)行著蛙。
-
- 在指定的時間排隊執(zhí)行block。
-
- 在指定的時間排隊一個應用程序定義的函數(shù)以供執(zhí)行耳贬。
-
- 將一個應用程序定義的函數(shù)提交給調度隊列以進行多個調用踏堡。
-
- 返回創(chuàng)建隊列時為隊列指定的標簽。
-
- 返回與當前分派隊列關聯(lián)的鍵的值咒劲。
-
- 設置指定調度隊列的鍵/值數(shù)據(jù)顷蟆。
-
- 獲取與指定調度隊列關聯(lián)的鍵的值。
-
- 用于dispatch_once函數(shù)的謂詞腐魂。
-
- 在應用程序的整個生命周期中帐偎,一次且只能執(zhí)行一次塊對象。
-
- 在應用程序的整個生命周期中蛔屹,只執(zhí)行一次應用程序定義的函數(shù)削樊。
-
- 執(zhí)行提供給主隊列的塊。
2. Managing Units of Work
調度Dispatch塊允許您直接配置隊列中各個工作單元的屬性兔毒。 他們還允許您為了等待完成漫贞,收到通知完成和/或取消它們的目的,處理個別工作單位育叁。
-
- 提交給調度隊列的塊原型迅脐,不帶任何參數(shù),沒有返回值豪嗽。
-
- 提交給調度隊列的函數(shù)原型仪际。
-
- 使用現(xiàn)有的塊和給定的標志在堆上創(chuàng)建新的分派塊。
-
dispatch_block_create_with_qos_class
- 在現(xiàn)有塊和給定標志的堆上創(chuàng)建一個新的調度塊昵骤,并為其指定QoS等級和相對優(yōu)先級树碱。
-
- 創(chuàng)建,同步執(zhí)行变秦,并從指定的塊和標志釋放調度塊成榜。
-
- 同步等待,直到指定的調度塊的執(zhí)行完成蹦玫,或者直到超過指定的超時時間赎婚。
-
- 當指定的調度塊的執(zhí)行完成時,安排通知塊被提交給隊列樱溉。
-
- 異步取消指定的分派塊挣输。
-
- 測試給定的調度塊是否被取消。
-
- 傳遞給dispatch_block_create和dispatch_block_create_with_qos_class函數(shù)的標志位福贞。
3. Prioritizing Work and Specifying Quality of Service
-
- 用于選擇合適的全局并發(fā)隊列撩嚼。
-
dispatch_queue_attr_make_with_qos_class
- 返回適合于創(chuàng)建具有所需服務質量信息的調度隊列的屬性。
4. Using Dispatch Groups
分組塊允許聚合同步。 您的應用程序可以提交多個塊完丽,并在完成時跟蹤恋技,即使它們可能運行在不同的隊列中。 如果在完成所有指定任務之后才能進行此操作逻族,則此行為會很有幫助蜻底。
-
- 一組塊對象提交到隊列以進行異步調用。
-
- 將塊提交到調度隊列聘鳞,并將塊與指定的調度組相關聯(lián)薄辅。
-
- 將應用程序定義的函數(shù)提交給調度隊列,并將其與指定的調度組相關聯(lián)抠璃。
-
- 當一組先前提交的塊對象完成時长搀,安排應用程序定義的函數(shù)提交給隊列。
-
- 同步等待先前提交的塊對象完成; 如果在指定的超時期限過去之前塊沒有完成鸡典,則返回。
5. Using Dispatch Semaphores
調度信號量是傳統(tǒng)計數(shù)信號量的有效實現(xiàn)枪芒。 只有當調用線程需要被阻塞時彻况,調度信號才會調用內核。 如果調用信號量不需要阻塞舅踪,則不進行內核調用纽甘。
-
- 等待(遞減)信號量。
6. Using Dispatch Barriers
調度阻塞允許您在并發(fā)調度隊列中創(chuàng)建同步點抽碌。 當遇到障礙時悍赢,并發(fā)隊列會延遲屏障塊(或任何其他塊)的執(zhí)行,直到在屏障完成執(zhí)行之前提交的所有塊為止货徙。 在這一點上左权,障礙塊自行執(zhí)行。 完成后痴颊,隊列恢復正常的執(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ù)對象的析構函數(shù)的常量。
-
- 表示內存連續(xù)或稀疏區(qū)域的不可變對象玉转。
-
- 用于調用數(shù)據(jù)對象中每個連續(xù)內存區(qū)域的塊突想。
-
- 用指定的內存緩沖區(qū)創(chuàng)建一個新的調度數(shù)據(jù)對象。
-
- 返回由調度數(shù)據(jù)對象管理的內存的邏輯大小
-
- 返回包含指定對象內存的連續(xù)表示的新調度數(shù)據(jù)對象。
-
- 返回由兩個其他數(shù)據(jù)對象的連接數(shù)據(jù)組成的新的分派數(shù)據(jù)對象蒿柳。
-
- 返回一個新的調度數(shù)據(jù)對象饶套,其內容由另一個對象的內存區(qū)域的一部分組成。
-
- 遍歷調度數(shù)據(jù)對象的內存垒探,并在每個區(qū)域執(zhí)行自定義代碼妓蛮。
-
- 返回包含另一個數(shù)據(jù)對象中的部分數(shù)據(jù)的數(shù)據(jù)對象。
8. Using Dispatch Time
-
- 基本時間常數(shù)圾叼。
-
Dispatch Time Multiplier Constants
- 用于計算時間值的乘數(shù)蛤克。
-
- 一個有點抽象的時間表示。
-
- 創(chuàng)建相對于默認時鐘的
dispatch_time_t
或修改現(xiàn)有的dispatch_function_t
夷蚊。
- 創(chuàng)建相對于默認時鐘的
-
- 根據(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ā)送事件標志筋现。
-
Dispatch Source Process Event Flags
- 過程事件標志位。
-
Dispatch Source Vnode Event Flags
- 文件系統(tǒng)對象事件標志位箱歧。
-
Dispatch Source Memory Pressure Event Flags
- 內存壓力事件標志位矾飞。
-
- 由調度源監(jiān)視的類型系統(tǒng)對象的標識符。
-
- 用于I/O操作的文件描述符呀邢。
-
- 創(chuàng)建一個新的調度源來監(jiān)視低級系統(tǒng)對象洒沦,并自動提交一個處理程序塊到調度隊列以響應事件。
-
- 返回調度源的待處理數(shù)據(jù)价淌。
-
- 返回與指定調度源關聯(lián)的底層系統(tǒng)句柄申眼。
-
- 返回調度源監(jiān)視的事件的掩碼。
-
- 將數(shù)據(jù)合并到類型為
DISPATCH_SOURCE_TYPE_DATA_ADD或DISPATCH_SOURCE_TYPE_DATA_OR
的調度源中蝉衣,并將其事件處理程序塊提交給其目標隊列括尸。
- 將數(shù)據(jù)合并到類型為
-
- 為定時器源設置開始時間,間隔和余量值病毡。
-
dispatch_source_set_registration_handler
- 為給定的調度源設置注冊處理程序塊姻氨。
-
dispatch_source_set_registration_handler_f
- 為給定的調度源設置注冊處理函數(shù)。
-
dispatch_source_set_event_handler
- 為給定的調度源設置事件處理程序塊剪验。
-
dispatch_source_set_event_handler_f
- 為給定的調度源設置事件處理函數(shù)肴焊。
-
dispatch_source_set_cancel_handler
- 為給定的調度源設置取消處理程序塊。
-
dispatch_source_set_cancel_handler_f
- 為給定的調度源設置取消處理函數(shù)
-
- 異步取消調度源功戚,阻止任何進一步的調用其事件處理程序塊娶眷。
-
- 測試給定的調度源是否被取消。
10. Managing Dispatch I/O
調度I / O通道API允許您管理基于文件描述符的操作啸臀。 該API支持基于流的和隨機訪問語義來訪問文件描述符的內容届宠。
-
- 可能創(chuàng)建的調度I / O通道的類型烁落。
-
Dispatch I/O Channel Closing Options
- 關閉調度I / O通道時使用的選項。
-
Dispatch I/O Channel Configuration Options
- 配置通道時使用的選項豌注。
-
- 一個
dispatch I/O
通道
- 一個
-
- dispatch I/O 通道類型伤塌。
-
- 處理程序塊用于處理調度I / O通道上的操作。
-
- 將指定的通道關閉到新的讀取和寫入操作轧铁。
-
- 用于指定通道關閉選項的標志類型每聪。
-
- 設置調用通道的I / O處理程序的間隔(以納秒為單位)。
-
- 用于指定通道調度間隔的標志類型齿风。
11. Working with Dispatch Objects
GCD提供了調度對象接口药薯,使您的應用程序能夠管理諸如內存管理,暫停和恢復執(zhí)行救斑,定義對象上下文以及記錄任務數(shù)據(jù)等方面的處理童本。 調度對象必須手動保留和釋放,而不是垃圾收集脸候。
-
- 激活調度對象穷娱。
-
- 遞增調度對象的引用(保留)計數(shù)。
-
- 減少調度對象的引用(保留)計數(shù)运沦。
-
- 返回對象的應用程序定義的上下文泵额。
-
- 將應用程序定義的上下文與對象關聯(lián)。
-
- 設置調度對象的終結器函數(shù)茶袒。
12. Protocols
13. Reference
后記
未完,待續(xù)~~~