溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

Dispatch Queues

發(fā)布時間:2020-04-09 07:01:46 來源:網(wǎng)絡(luò) 閱讀:487 作者:huahanjie 欄目:開發(fā)技術(shù)

GCD(Grand Central Dispatch)的 dispatch queues 是一個實現(xiàn)多任務(wù)的很好的工具。Dispatch queues 讓你能夠方便的使用blocks,不管你想要去調(diào)用同步或異步。你可以實現(xiàn)幾乎所有的以前你通過separate 的threads完成的任務(wù)。相對thread的code 而言,dispatch queues的優(yōu)點是更簡單和更有效率。

這章節(jié)提供了dispatch queues的詳細(xì)介紹,所有關(guān)于怎么樣使用他們?nèi)?zhí)行普通任務(wù)的信息。


一、關(guān)于Dispatch Queues

   Dispatch Queues 是一個簡單實現(xiàn)實現(xiàn)異步和并發(fā)任務(wù)的方法。A dispatch queue is an object-like structures that manages the tasks you submit to it.所有的dispatch queue都是先進(jìn)先出的數(shù)據(jù)結(jié)構(gòu)

   Serial queues:每次只執(zhí)行一個任務(wù),并且先進(jìn)先出。如果想通過這個實現(xiàn)并發(fā)可以創(chuàng)建多個serial queue 。但是如果希望實現(xiàn)許多并發(fā)則建議使用并發(fā)queues。

           dispatch_queue_t queue;

           queue =  dispatch_queue_create("com.example.MyQueue",NULL);



  Concurrent  Queue :(global dispatch queue) 并發(fā),但是仍然按加進(jìn)隊列的順序啟動。并發(fā)執(zhí)行的任務(wù)在確定的線程中(被并發(fā)隊列管理著的)。具體的執(zhí)行的線程數(shù)由系統(tǒng)決定,是動態(tài)的。In IOS5 and later ,我們能夠自己創(chuàng)建并發(fā)隊列通過設(shè)定為DISPATCH_QUEUE_CONCURRENT 的類型

          系統(tǒng)提供了4個并發(fā)隊列 是全局的,他們只是優(yōu)先等級不同。因為是全局的,我們不在需要創(chuàng)建了。通過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:第二個參數(shù)以后在解釋,現(xiàn)在我們只要傳0得參數(shù)就行了。

         



Main dispatch queue :主隊列是一個全局可獲取在應(yīng)用主線程中執(zhí)行任務(wù)的的竄行隊列。 通過run loop 將我們要執(zhí)行的任務(wù)加進(jìn)主線程。如果不是cocoa的應(yīng)用,也不想特別的創(chuàng)建run loop ,你必須通過dispatch_main方法

    dispatch_get_main_queue.


二,獲取運(yùn)動時的隊列

你可以通過dispatch_get_current_queue獲取運(yùn)行時的隊列: 

1. 

dispatch_queue_t currentQueue = dispatch_get_current_queue();  

如果在隊列執(zhí)行任務(wù)中調(diào)用,返回執(zhí)行此任務(wù)的隊列;如果在主線程中調(diào)用,將返回主隊列;如果在一般線程(非主線程線程非隊列執(zhí)行任務(wù))中調(diào)用,返回DISPATCH_QUEUE_PRIORITY_DEFAULT全局隊列。

三、在隊列中運(yùn)行任務(wù)

異步

dispatch_async(aQueue,^{

    //do somethings

});

同步

dispatch_sync(aQueue,^{

});

四、Dispatch Queue的內(nèi)存管理

除了系統(tǒng)定義的Dispatch Queue,我們自定義的Dispatch Queue需要手動的管理它的內(nèi)存。

dispatch_retain dispatch_release


          

    

              

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI