IOS-GCD的一點認識

Serial Dispatch Queue  串行調度隊列 等待現在執行中處理結束  

Concurrent Dispatch Queue  並行調度隊列 不等待現在執行中處理結束


Main Dispatch Queue 在主線程中執行,也就是Serial Dispatch Queue 跟 NSObject類的performSelectorOnMainThread實例方法這一執行方法相同


Global Dispatch Queue 是所有應用程序都能夠使用的Concurrent Dispatch Queue 。沒必要通過dispatch_queue_create函數逐個生成Concurrent Dispatch Queue,只要獲取Global Dispatch Queue使用即可


Global Dispatch Queue 有4個優先級,高優先級 High Priority, 默認優先級 Default Priority, 低優先級 Low Prioity 後臺優先級 Background Priority.


dispatch_queue_create 函數生成的Dispatch Queue 不管是Serial Dispatch Queue還是 Concurrent Dispatch Queue ,都與默認優先級Global Dispatch Queue 相同執行優先級的線程。而變更生成的Dispatch Queue的執行優先級要使用 dispatch_set_target_queue函數.


dispatch_barrier_async 函數會等待追加到Concurrent Dispatch Queue 上的並行執行的處理全部介紹之後,再將指定的處理追加到該Concurrent Dispatch Queue 種,然後在由dispatch_barrier_async函數追加的處理執行完畢後,Concurrent Dispatch Queue 才恢復爲一搬的動作,追加到該Concurrent Dispatch Queue 的處理又開始並行執行,


dispatch_async 函數的async意味着非同步(asynchronous),就是將指定的Block 非同步的追加到指定的Dispatch Queue中,dispatch_async不做任何等待


dispatch_sync,sync意味着同步(synchronous),也就是將指定的Block “同步”追加到指定的Dispatch Queue中。在追加的Block結束之前,dispatch_sync函數會一直等待.


dispatch_apply函數是dispatch_sync函數和dispatch Group的關聯API,該函數按指定的次數將指定的Block追加到指定的Dispatch Queue中,並等待全部處理執行結束


當追加大量處理到Dispatch Queue時,在追加處理的過程中,有時希望不執行已追加的處理,例如演算結果被Block劫獲時,一些處理會對這個演算結果造成影響。在這種情況下,只要掛起Dispatch Queue即可。當可以執行時再恢復

dispatch_suspend 掛起指定的Dispatch Queue

 dispatch_resume 恢復指定的Dispatch Queue

這些函數對已經執行的處理沒有影響。掛起後,追加到Dispatch Queue中但尚未執行的處理在此之後停止執行。而恢復則使得這些處理能夠繼續執行


Dispatahc Semaphore 是持有計數的信號,該計數是多線程編程中的計數類型信號.計數爲0時等待,計數爲1孩子大於1時,減去1而不等待.在沒有Serial Dispatch Queue和dispatch_barrier_async函數那麼大粒度且一部分處理需要進行排他控制的情況下,Dispatch Semaphore便可發揮威力.


Dispatch I/O 和 Dispatch Data 可以把文件分成合適的大小並使用Global Dispatch Queue並列讀取

Dispatch Data 可以把數據進行簡單的結合和分割


Global Dispatch Queue 有如下8種

High Priority,Defaulty Priority,Low Priority,Background Priiority,High Overcommit priority,Default Overcommit Priority,Low Overcommit Priority,Background Overcommit priority



Dispatch Queue

用於管理追加的BLOCK的C語言層實現的FIFO隊列

Atomic 函數中實現的用於排他控制的輕量級信號

用於管理線程的C語言層的實現的一些容器


Dispatch Source

BSD系內核慣有功能kqueue的包裝


dispatch source 負責監聽事件

dispatch_source_create(dispatch_source_type_t type, uintptr_t handle, unsigned long mask, dispatch_queue_t queue)

第1個參數:要監聽的事件類型 第2個參數:可以理解爲句柄、索引或id,假如要監聽進程,需要傳入進程的ID 第3個參數:根據參數2,可以理解爲描述,提供更詳細的描述,讓它知道具體要監聽什麼 第4個參數:當事件發生時,將block添加至哪個隊列來執行

可監聽事件的類型
 DISPATCH_SOURCE_TYPE_TIMER        定時響應,在網絡編程的通信超時等情況下可使用該例
 DISPATCH_SOURCE_TYPE_SIGNAL      接收到UNIX信號時響應
 DISPATCH_SOURCE_TYPE_READ   IO操作,如對文件的操作、socket操作的讀響應
 DISPATCH_SOURCE_TYPE_WRITE     IO操作,如對文件的操作、socket操作的寫響應   
 DISPATCH_SOURCE_TYPE_VNODE    文件狀態監聽,文件被刪除、移動、重命名
 DISPATCH_SOURCE_TYPE_PROC  進程監聽,如進程的退出、創建一個或更多的子線程、進程收到UNIX信號
 DISPATCH_SOURCE_TYPE_MACH_SEND
 DISPATCH_SOURCE_TYPE_MACH_RECV   上面2個都屬於Mach相關事件響應
 DISPATCH_SOURCE_TYPE_DATA_ADD
 DISPATCH_SOURCE_TYPE_DATA_OR          上面2個都屬於自定義的事件,並且也是有自己來觸發

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章