dispatch_set_target_queue
我們發(fā)現(xiàn)獲取全局隊列時破衔,可以設(shè)置隊列的優(yōu)先級冠王,但是我們自己創(chuàng)建的隊列缺沒有設(shè)置優(yōu)先級,如果我們想要設(shè)置隊列的優(yōu)先級就需要通過dispatch_set_target_queue
方法了。
dispatch_set_target_queue
方法傳入的兩個參數(shù)都是隊列搅荞,第一個是需要修改優(yōu)先級的隊列,它的優(yōu)先級將會變成與第二個隊列一致框咙。
dispatch_queue_t global_queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0);
dispatch_queue_t concurrentQueue = dispatch_queue_create("concurrentQueue", DISPATCH_QUEUE_CONCURRENT);
dispatch_set_target_queue(concurrentQueue, global_queue);
我們自己創(chuàng)建的隊列的優(yōu)先級將會變成和我們獲取的全局隊列的優(yōu)先級一致咕痛,都是DISPATCH_QUEUE_PRIORITY_HIGH
。
上面我們講的是都是并發(fā)隊列的喇嘱,如果第二個參數(shù)傳入的是串行隊列茉贡?
先來看看將3個串行隊列設(shè)置目標(biāo)隊列為同一個串行隊列,我們知道多個串行隊列者铜,如果不是在同一個線程上進(jìn)行同步執(zhí)行腔丧,那么他們之間的情況是并發(fā)的
dispatch_queue_t serialQueue1 = dispatch_queue_create("serialQueue1", DISPATCH_QUEUE_SERIAL);
dispatch_queue_t serialQueue2 = dispatch_queue_create("serialQueue2", DISPATCH_QUEUE_SERIAL);
dispatch_queue_t serialQueue3 = dispatch_queue_create("serialQueue3", DISPATCH_QUEUE_SERIAL);
dispatch_async(serialQueue1, ^{
NSLog(@"任務(wù)1開始");
sleep(3);
NSLog(@"任務(wù)1完成");
});
dispatch_async(serialQueue2, ^{
NSLog(@"任務(wù)2開始");
sleep(2);
NSLog(@"任務(wù)2完成");
});
dispatch_async(serialQueue3, ^{
NSLog(@"任務(wù)3開始");
sleep(1);
NSLog(@"任務(wù)3完成");
});
打印結(jié)果如下
15:06:30.725 任務(wù)2開始
15:06:30.725 任務(wù)3開始
15:06:30.725 任務(wù)1開始
15:06:31.729 任務(wù)3完成
15:06:32.729 任務(wù)2完成
15:06:33.727 任務(wù)1完成
從打印記過可以看出3個任務(wù)同時進(jìn)行,但是如果我們將這3個串行隊列的目標(biāo)隊列都設(shè)置為同一個串行隊列呢作烟?
dispatch_queue_t serialQueue1 = dispatch_queue_create("serialQueue1", DISPATCH_QUEUE_SERIAL);
dispatch_queue_t serialQueue2 = dispatch_queue_create("serialQueue2", DISPATCH_QUEUE_SERIAL);
dispatch_queue_t serialQueue3 = dispatch_queue_create("serialQueue3", DISPATCH_QUEUE_SERIAL);
dispatch_queue_t serialQueue = dispatch_queue_create("serialQueue", DISPATCH_QUEUE_SERIAL);
dispatch_set_target_queue(serialQueue1, serialQueue);
dispatch_set_target_queue(serialQueue2, serialQueue);
dispatch_set_target_queue(serialQueue3, serialQueue);
dispatch_async(serialQueue1, ^{
NSLog(@"任務(wù)1開始");
sleep(3);
NSLog(@"任務(wù)1完成");
});
dispatch_async(serialQueue2, ^{
NSLog(@"任務(wù)2開始");
sleep(2);
NSLog(@"任務(wù)2完成");
});
dispatch_async(serialQueue3, ^{
NSLog(@"任務(wù)3開始");
sleep(1);
NSLog(@"任務(wù)3完成");
});
打印結(jié)果如下
15:06:40.729 任務(wù)1開始
15:06:43.733 任務(wù)1完成
15:06:43.733 任務(wù)2開始
15:06:45.734 任務(wù)2完成
15:06:45.734 任務(wù)3開始
15:06:46.734 任務(wù)3完成
從打印結(jié)果可以看出愉粤,3個任務(wù)是按順序執(zhí)行的,完成一個下一個才開始拿撩,dispatch_set_target_queue
在串行隊列直接的使用效果就是使得被添加到同一串行隊列上的隊列上的任務(wù)按順序執(zhí)行衣厘,而不是同時進(jìn)行。
我們在嘗試下將3個并發(fā)隊列的目標(biāo)隊列設(shè)置為一個串行隊列
dispatch_queue_t concurrentQueue1 = dispatch_queue_create("concurrentQueue1", DISPATCH_QUEUE_CONCURRENT);
dispatch_queue_t concurrentQueue2 = dispatch_queue_create("concurrentQueue2", DISPATCH_QUEUE_CONCURRENT);
dispatch_queue_t concurrentQueue3 = dispatch_queue_create("concurrentQueue3", DISPATCH_QUEUE_CONCURRENT);
dispatch_queue_t serialQueue = dispatch_queue_create("serialQueue", DISPATCH_QUEUE_SERIAL);
dispatch_set_target_queue(concurrentQueue1, serialQueue);
dispatch_set_target_queue(concurrentQueue2, serialQueue);
dispatch_set_target_queue(concurrentQueue3, serialQueue);
dispatch_async(concurrentQueue1, ^{
NSLog(@"任務(wù)1開始");
sleep(3);
NSLog(@"任務(wù)1完成");
});
dispatch_async(concurrentQueue2, ^{
NSLog(@"任務(wù)2開始");
sleep(2);
NSLog(@"任務(wù)2完成");
});
dispatch_async(concurrentQueue3, ^{
NSLog(@"任務(wù)3開始");
sleep(1);
NSLog(@"任務(wù)3完成");
});
打印結(jié)果如下
15:20:25.005 任務(wù)1開始
15:20:28.011 任務(wù)1完成
15:20:28.011 任務(wù)2開始
15:20:30.016 任務(wù)2完成
15:20:30.017 任務(wù)3開始
15:20:31.018 任務(wù)3完成
從結(jié)果可以看出压恒,也是順序執(zhí)行的影暴,也就是說將多個隊列的目標(biāo)隊列設(shè)置為同一個串行隊列怖亭,多個隊列上的任務(wù)將會按添加任務(wù)的順序進(jìn)行處理。
ps:這個方法如果是給將主線程坤检、全局隊列作為第一個參數(shù)的結(jié)果未知兴猩,對串行隊列進(jìn)行循環(huán)設(shè)置對方為目標(biāo)隊列的結(jié)果暫時未知
總結(jié)
dispatch_set_target_queue
方法的兩個作用:
1.通過全局隊列來給我們自己創(chuàng)建的隊列設(shè)置隊列的優(yōu)先級。
2.可以為多個隊列設(shè)置同一個串行隊列為目標(biāo)隊列早歇,實現(xiàn)多個隊列直接的任務(wù)按順序執(zhí)行倾芝。
ps:一直沒有想明白第二種情況的使用場景,有想法的朋友麻煩留言交流下