-
dispatch_set_target_queue
- 可設(shè)置隊列的優(yōu)先級
- 可設(shè)置隊列的執(zhí)行階層
dispatch_set_target_queue(myQueue, targetQueue); 設(shè)置優(yōu)先級 // 目標(biāo)隊列可以是 1. dispatch_get_mian_queue 2. dispatch_get_global_queue // 當(dāng)設(shè)置為`dispatch_get_global_queue`, 則執(zhí)行階層還是原來自身的, 優(yōu)先級與目標(biāo)隊列一致 // 當(dāng)設(shè)置為`dispatch_get_mian_queue`, 執(zhí)行階層, 優(yōu)先級都與目標(biāo)隊列一致 設(shè)置執(zhí)行階層 1. dispatch_get_mian_queue 主隊列 2. dispatch_get_global_queue 全局并發(fā)隊列 3. dispatch_queue_create("targetQueue", DISPATCH_QUEUE_CONCURRENT) 并發(fā)隊列 4. dispatch_queue_create("targetQueue", DISPATCH_QUEUE_SERIAL) 串行隊列
優(yōu)先級由
dispatch_get_mian_queue
,dispatch_get_global_queue
設(shè)定執(zhí)行階層, 由自身與目標(biāo)隊列共同決定
串行隊列完全碾壓并發(fā)隊列
- test code
// 創(chuàng)建的隊列是串行隊列
dispatch_queue_t queue = dispatch_queue_create("myQueue", DISPATCH_QUEUE_SERIAL);
// 目標(biāo)隊列是全局并發(fā)隊列
dispatch_queue_t targetQueue = dispatch_get_global_queue(0, 0);
dispatch_set_target_queue(queue, targetQueue);
for (NSInteger i = 0; i < 100; i++) {
dispatch_async(queue, ^{
if (i % 2 == 0) {
[NSThread sleepForTimeInterval:3];
}
NSLog(@"%@ - %ld", [NSThread currentThread], i);
});
}
// 輸出
2017-08-08 10:28:15.625 breadTrip[3710:419701] <NSThread: 0x608000269400>{number = 3, name = (null)} - 0
2017-08-08 10:28:15.625 breadTrip[3710:419701] <NSThread: 0x608000269400>{number = 3, name = (null)} - 1
2017-08-08 10:28:18.629 breadTrip[3710:419701] <NSThread: 0x608000269400>{number = 3, name = (null)} - 2
2017-08-08 10:28:18.629 breadTrip[3710:419701] <NSThread: 0x608000269400>{number = 3, name = (null)} - 3
- 結(jié)論:
- queue的優(yōu)先級與targetQueue一致
- queue的執(zhí)行階層還是自身的串行隊列
dispatch_queue_t queue = dispatch_queue_create("myQueue", DISPATCH_QUEUE_CONCURRENT);
dispatch_queue_t targetQueue = dispatch_get_global_queue(0, 0);
dispatch_set_target_queue(queue, targetQueue);
- 結(jié)論:
- queue的優(yōu)先級與targetQueue一致
- queue的執(zhí)行階層與targetQueue一致是的并發(fā)隊列
dispatch_queue_t queue1 = dispatch_queue_create("myQueue", DISPATCH_QUEUE_CONCURRENT);
dispatch_queue_t queue2 = dispatch_queue_create("myQueue", DISPATCH_QUEUE_SERIAL);
dispatch_queue_t targetQueue = dispatch_get_main_queue();
dispatch_set_target_queue(queue1, targetQueue);
dispatch_set_target_queue(queue2, targetQueue);
- 結(jié)論:
- queue1, queue2 的優(yōu)先級與targetQueue一致
- queue1, queue2 的執(zhí)行階層與targetQueue一致是的串行隊列
- queue1, queue2追加任務(wù)都會在主線程執(zhí)行
dispatch_queue_t queue = dispatch_queue_create("myQueue", DISPATCH_QUEUE_SERIAL);
dispatch_queue_t targetQueue = dispatch_queue_create("targetQueue", DISPATCH_QUEUE_CONCURRENT);
dispatch_set_target_queue(queue, targetQueue);
- 結(jié)論:
- queue的優(yōu)先級與targetQueue一致
- queue的執(zhí)行階層不變還是
串行隊列
dispatch_queue_t queue = dispatch_queue_create("myQueue", DISPATCH_QUEUE_CONCURRENT);
dispatch_queue_t targetQueue = dispatch_queue_create("targetQueue", DISPATCH_QUEUE_CONCURRENT);
dispatch_set_target_queue(queue, targetQueue);
- 結(jié)論:
queue的優(yōu)先級與targetQueue一致
queue的執(zhí)行階層與targetQueue一致, 并發(fā)隊列
dispatch_queue_t queue1 = dispatch_queue_create("myQueue", DISPATCH_QUEUE_CONCURRENT);
dispatch_queue_t queue2 = dispatch_queue_create("myQueue", DISPATCH_QUEUE_SERIAL);
dispatch_queue_t targetQueue = dispatch_queue_create("targetQueue", DISPATCH_QUEUE_SERIAL);
dispatch_set_target_queue(queue, targetQueue);
- 結(jié)論:
queue1, queue2 的優(yōu)先級與targetQueue一致
queue1, queue2 的執(zhí)行階層與targetQueue一致是的串行隊列
dispatch_queue_t queue1 = dispatch_queue_create("myQueue", DISPATCH_QUEUE_SERIAL);
dispatch_queue_t queue2 = dispatch_queue_create("myQueue", DISPATCH_QUEUE_CONCURRENT);
dispatch_queue_t targetQueue = dispatch_queue_create("targetQueue", DISPATCH_QUEUE_CONCURRENT);
dispatch_set_target_queue(queue, targetQueue);
- 結(jié)論:
queue1, queue2 的優(yōu)先級與targetQueue一致
queue2 的執(zhí)行階層與targetQueue一致是的串行隊列
queue1 的執(zhí)行階層不變還是串行隊列
總結(jié)
- 優(yōu)先級有目標(biāo)隊列一致
- 當(dāng)自身為并發(fā)隊列,則執(zhí)行階層與目標(biāo)隊列一致
- 當(dāng)自身為串行隊列,則執(zhí)行階層不變
- 目標(biāo)隊列為
主對列
時, 執(zhí)行階層與主隊列一致