用法一:指定優(yōu)先級
系統(tǒng)的Global Queue是可以指定優(yōu)先級的乾蛤,那我們可以用到dispatch_set_target_queue這個方法來指定自己創(chuàng)建隊列的優(yōu)先級
在這里我們解釋一下:dispatch_queue_create函數(shù)生成的DisPatch Queue不管是Serial DisPatch Queue還是Concurrent Dispatch Queue,執(zhí)行的優(yōu)先級都與默認優(yōu)先級的Global Dispatch queue相同,如果需要變更生成的Dispatch Queue的執(zhí)行優(yōu)先級則需要使用dispatch_set_target_queue函數(shù)
代碼用法一:
dispatch_queue_t serialDiapatchQueue=dispatch_queue_create("com.GCD_demo.www", DISPATCH_QUEUE_SERIAL);
dispatch_queue_t dispatchgetglobalqueue=dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_LOW, 0);
// 第一個參數(shù)為要設置優(yōu)先級的queue,第二個參數(shù)是參照物,既將第一個queue的優(yōu)先級和第二個queue的優(yōu)先級設置一樣叶眉。
dispatch_set_target_queue(serialDiapatchQueue, dispatchgetglobalqueue);
dispatch_async(serialDiapatchQueue, ^{
NSLog(@"我優(yōu)先級低慷妙,先讓讓");
});
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
NSLog(@"我優(yōu)先級高,我先block");
});
打印結(jié)果:
2017-05-04 11:08:49.388 Practice_Animation[1408:539481] 我優(yōu)先級高,我先block
2017-05-04 11:08:49.388 Practice_Animation[1408:539185] 我優(yōu)先級低僻焚,先讓讓
用法二:隊列執(zhí)行
2、dispatch_set_target_queue除了能用來設置隊列的優(yōu)先級之外膝擂,還能夠創(chuàng)建隊列的層次體系虑啤,當我們想讓不同隊列中的任務同步的執(zhí)行時,我們可以創(chuàng)建一個串行隊列架馋,然后將這些隊列的target指向新創(chuàng)建的隊列即可
解讀使用dispatch_set_target_queue將多個串行的queue指定到了同一目標狞山,那么著多個串行queue在目標queue上就是同步執(zhí)行的,不再是并行執(zhí)行叉寂。
//1.創(chuàng)建目標隊列
dispatch_queue_t targetQueue = dispatch_queue_create("test.target.queue", DISPATCH_QUEUE_SERIAL);
//2.創(chuàng)建3個串行隊列
dispatch_queue_t queue1 = dispatch_queue_create("test.1", DISPATCH_QUEUE_SERIAL);
dispatch_queue_t queue2 = dispatch_queue_create("test.2", DISPATCH_QUEUE_SERIAL);
dispatch_queue_t queue3 = dispatch_queue_create("test.3", DISPATCH_QUEUE_SERIAL);
//3.將3個串行隊列分別添加到目標隊列
dispatch_set_target_queue(queue1, targetQueue);
dispatch_set_target_queue(queue2, targetQueue);
dispatch_set_target_queue(queue3, targetQueue);
dispatch_async(queue1, ^{
NSLog(@"1 in");
[NSThread sleepForTimeInterval:3.f];
NSLog(@"1 out");
});
dispatch_async(queue2, ^{
NSLog(@"2 in");
[NSThread sleepForTimeInterval:2.f];
NSLog(@"2 out");
});
dispatch_async(queue3, ^{
NSLog(@"3 in");
[NSThread sleepForTimeInterval:1.f];
NSLog(@"3 out");
});
打印結(jié)果:
2017-05-04 11:37:05.638 Practice_Animation[1456:648304] 1 in
2017-05-04 11:37:08.643 Practice_Animation[1456:648304] 1 out
2017-05-04 11:37:08.644 Practice_Animation[1456:648304] 2 in
2017-05-04 11:37:10.649 Practice_Animation[1456:648304] 2 out
2017-05-04 11:37:10.649 Practice_Animation[1456:648304] 3 in
2017-05-04 11:37:11.652 Practice_Animation[1456:648304] 3 out
線程注意事項
生成多個Serial DisPatch Queue時的注意事項
Serial DisPatch Queue是一個串行隊列,只能同時執(zhí)行1個追加處理(即任務),當用Dispatch_queue_create函數(shù)生成多個Serial DisPatch Queue時,每個Serial DisPatch Queue均獲得一個線程,即多個Serial DisPatch Queue可并發(fā)執(zhí)行,同時處理添加到各個Serial DisPatch Queue中的任務,但要注意如果過多地使用多線程,就會消耗大量內(nèi)存,引起大量的上下文切換,大幅度降低系統(tǒng)的響應性能,所以我們只在為了避免多個線程更新相同資源導致數(shù)據(jù)競爭時,使用Serial DisPatch Queue萍启。