GCD隊列總體分為同步隊列和異步隊列兩種,添加到同步隊列中的任務(wù),根據(jù)添加的順序挨個執(zhí)行往衷,添加到異步隊列里面的任務(wù),無序并發(fā)執(zhí)行严卖。
同步隊列
獲取同步隊列的方式有兩種席舍,一種是通過dispatch_get_main_queue
函數(shù),獲取到系統(tǒng)創(chuàng)建的主隊列哮笆,另外一種方式是自己通過dispatch_queue_create
函數(shù)創(chuàng)建同步隊列来颤。
//主隊列
dispatch_queue_t mainQueue = dispatch_get_main_queue();
//同步隊列
dispatch_queue_t serialQueue = dispatch_queue_create("com.zzfsuiye.serial",DISPATCH_QUEUE_CONCURRENT)
從代碼中可以看到dispatch_queue_create
函數(shù)需要兩個參數(shù)汰扭,第一個參數(shù)是隊列的標簽,一般使用倒置的域名寫法福铅,第二個參數(shù)是指定創(chuàng)建的隊列的類型萝毛,DISPATCH_QUEUE_CONCURRENT
指我們創(chuàng)建同步隊列,異步隊列也可以通過該方法創(chuàng)建滑黔,只需要將第二個參數(shù)調(diào)整為DISPATCH_QUEUE_CONCURRENT
即可笆包。
隊列標簽是隊列的唯一標識,所以不同的隊列標簽值不要相同略荡。我們可以通過函數(shù)dispatch_queue_get_label
獲取指定隊列的標簽庵佣。
//獲取隊列標簽,在這里我們得到com.zzfsuiye.serial
char *serialLabel = dispatch_queue_get_label(mainQueue)
對于dispatch_queue_get_label
函數(shù)有個特殊的參數(shù)DISPATCH_CURRENT_QUEUE_LABEL
,我們可以通過它獲取到當前執(zhí)行任務(wù)所在隊列的標簽汛兜。
char *currentLabel = dispatch_queue_get_label(DISPATCH_CURRENT_QUEUE_LABEL)
異步隊列
和同步隊列相同秧了,異步隊列的獲取方式同樣有兩種,一種是通過dispatch_get_global_queue獲取系統(tǒng)創(chuàng)建的全局異步隊列序无,另外一種方式是自己通過dispatch_queue_create
函數(shù)創(chuàng)建同步隊列验毡。
//全局異步隊列
dispatch_queue_t globalQueue =dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
//異步隊列
dispatch_queue_t concurrentQueue = dispatch_queue_create("com.zzfsuiye.concurrent", DISPATCH_QUEUE_CONCURRENT);
首先我們來看dispatch_get_global_queue
函數(shù),函數(shù)接收兩個參數(shù)帝嗡,第一個參數(shù)指定隊列的優(yōu)先級晶通,第二個參數(shù)是預(yù)留字段,傳0即可哟玷。
創(chuàng)建異步隊列的函數(shù)我們在同步隊列那里已經(jīng)講過狮辽,這里就不在介紹。不過我們在這里注意到全局隊列是可以設(shè)置優(yōu)先級的巢寡,我們自己創(chuàng)建隊列的函數(shù)無法指定優(yōu)先級喉脖。也就是自己創(chuàng)建的隊列的優(yōu)先級都是相等的。有沒有辦法可以更改自己創(chuàng)建的優(yōu)先級呢抑月,這時候就要用到dispatch_set_target_queue
函數(shù)树叽。
dispatch_set_target_queue(concurrentQueue,globalQueue);
dispatch_set_target_queue
函數(shù)第一個參數(shù)concurrentQueue
是要更改優(yōu)先級的隊列,第二個參數(shù)globalQueue
是參考隊列谦絮,也就是將隊列concurrentQueue
的優(yōu)先級設(shè)置成和隊列globalQueue
一樣题诵。