GCD(Grand Central Dispatch)的 dispatch queues 是一個實作多任務的很好的工具。Dispatch queues 讓你能夠友善的使用blocks,不管你想要去調用同步或異步。你可以實作幾乎所有的以前你通過separate 的threads完成的任務。相對thread的code 而言,dispatch queues的優點是更簡單和更有效率。
這章節提供了dispatch queues的詳細介紹,所有關于怎麼樣使用他們去執行普通任務的資訊。
一、關于Dispatch Queues
Dispatch Queues 是一個簡單實作實作異步和并發任務的方法。A dispatch queue is an object-like structures that manages the tasks you submit to it.所有的dispatch queue都是先進先出的資料結構
Serial queues:每次隻執行一個任務,并且先進先出。如果想通過這個實作并發可以建立多個serial queue 。但是如果希望實作許多并發則建議使用并發queues。
dispatch_queue_t queue;
queue = dispatch_queue_create("com.example.MyQueue",NULL);
Concurrent Queue :(global dispatch queue) 并發,但是仍然按加進隊列的順序啟動。并發執行的任務在确定的線程中(被并發隊列管理着的)。具體的執行的線程數由系統決定,是動态的。In IOS5 and later ,我們能夠自己建立并發隊列通過設定為DISPATCH_QUEUE_CONCURRENT 的類型
系統提供了4個并發隊列 是全局的,他們隻是優先等級不同。因為是全局的,我們不在需要建立了。通過dispatch_get_global_queue
dispatch_queue_t aQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0)
DISPATCH_QUEUE_PRIORITY_HIGH 和DISPATCH_QUEUE_PRIORITY_LOW ,DISPATCH_QUEUE_PRIORITY_BACKGROUND
note:第二個參數以後在解釋,現在我們隻要傳0得參數就行了。
Main dispatch queue :主隊列是一個全局可擷取在應用主線程中執行任務的的竄行隊列。 通過run loop 将我們要執行的任務加進主線程。如果不是cocoa的應用,也不想特别的建立run loop ,你必須通過dispatch_main方法
dispatch_get_main_queue.
二,擷取運動時的隊列
你可以通過dispatch_get_current_queue擷取運作時的隊列:
1.
dispatch_queue_t currentQueue = dispatch_get_current_queue();
如果在隊列執行任務中調用,傳回執行此任務的隊列;如果在主線程中調用,将傳回主隊列;如果在一般線程(非主線程線程非隊列執行任務)中調用,傳回DISPATCH_QUEUE_PRIORITY_DEFAULT全局隊列。
三、在隊列中運作任務
異步
dispatch_async(aQueue,^{
//do somethings
});
同步
dispatch_sync(aQueue,^{
四、Dispatch Queue的記憶體管理
除了系統定義的Dispatch Queue,我們自定義的Dispatch Queue需要手動的管理它的記憶體。
dispatch_retain dispatch_release