前提:dispatch_queue_create創(chuàng)建的Dispatch Queue都是使用默認優(yōu)先級別的線程涧窒。
問題一戚嗅、dispatch_set_target_queue的作用?
1益缠、變更dispatch_queue_create函數生成的Dispatch Queue的執(zhí)行優(yōu)先級
2、作為Dispatch Queue的執(zhí)行階層。
dispatch_set_target_queue(dispatch_object_t object, dispatch_queue_t queue);
第一個參數:
要變更執(zhí)行優(yōu)先級的Dispatch Queue翠肘,不能為Main Dispatch Queue和Global Dispatch Queue。
第二個參數:
要使用的執(zhí)行優(yōu)先級相同優(yōu)先級的Global Dispatch Queue辫秧。
變更優(yōu)先級
// 要變更優(yōu)先級的串行隊列束倍,初始是默認優(yōu)先級
dispatch_queue_t serialQueue = dispatch_queue_create("com.gcd.setTargetQueue.serialQueue", NULL);
// 獲取優(yōu)先級為后臺優(yōu)先級的全局隊列
dispatch_queue_t globalDefaultQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0);
// 變更優(yōu)先級
dispatch_set_target_queue(serialQueue, globalDefaultQueue);
作為執(zhí)行階層
多個Serial Dispatch Queue用dispatch_set_target_queue函數指定目標(第二個參數)為某一個Serial Dispatch Queue。那原先并行執(zhí)行的多個Serial Dispatch Queue盟戏,在目標Serial Dispatch Queue上只能同時執(zhí)行一個處理绪妹,這樣可以防止處理并行執(zhí)行。
設置執(zhí)行階層前:
dispatch_queue_t serialQueue1 = dispatch_queue_create("com.gcd.setTargetQueue2.serialQueue1", NULL);
dispatch_queue_t serialQueue2 = dispatch_queue_create("com.gcd.setTargetQueue2.serialQueue2", NULL);
dispatch_queue_t serialQueue3 = dispatch_queue_create("com.gcd.setTargetQueue2.serialQueue3", NULL);
dispatch_queue_t serialQueue4 = dispatch_queue_create("com.gcd.setTargetQueue2.serialQueue4", NULL);
dispatch_queue_t serialQueue5 = dispatch_queue_create("com.gcd.setTargetQueue2.serialQueue5", NULL);
dispatch_async(serialQueue1, ^{
NSLog(@"1");
});
dispatch_async(serialQueue2, ^{
NSLog(@"2");
});
dispatch_async(serialQueue3, ^{
NSLog(@"3");
});
dispatch_async(serialQueue4, ^{
NSLog(@"4");
});
dispatch_async(serialQueue5, ^{
NSLog(@"5");
});
輸出:
2018-07-22 18:37:51.908107+0800 Demo[1801:121342] 2
2018-07-22 18:37:51.908107+0800 Demo[1801:121343] 3
2018-07-22 18:37:51.908107+0800 Demo[1801:121341] 1
2018-07-22 18:37:51.908148+0800 Demo[1801:121344] 4
2018-07-22 18:37:51.908169+0800 Demo[1801:121352] 5
設置執(zhí)行階層后:
dispatch_queue_t serialQueue1 = dispatch_queue_create("com.gcd.setTargetQueue2.serialQueue1", NULL);
dispatch_queue_t serialQueue2 = dispatch_queue_create("com.gcd.setTargetQueue2.serialQueue2", NULL);
dispatch_queue_t serialQueue3 = dispatch_queue_create("com.gcd.setTargetQueue2.serialQueue3", NULL);
dispatch_queue_t serialQueue4 = dispatch_queue_create("com.gcd.setTargetQueue2.serialQueue4", NULL);
dispatch_queue_t serialQueue5 = dispatch_queue_create("com.gcd.setTargetQueue2.serialQueue5", NULL);
//創(chuàng)建目標串行隊列
dispatch_queue_t targetSerialQueue = dispatch_queue_create("com.gcd.setTargetQueue2.targetSerialQueue", NULL);
//設置執(zhí)行階層
dispatch_set_target_queue(serialQueue1, targetSerialQueue);
dispatch_set_target_queue(serialQueue2, targetSerialQueue);
dispatch_set_target_queue(serialQueue3, targetSerialQueue);
dispatch_set_target_queue(serialQueue4, targetSerialQueue);
dispatch_set_target_queue(serialQueue5, targetSerialQueue);
dispatch_async(serialQueue1, ^{
NSLog(@"1");
});
dispatch_async(serialQueue2, ^{
NSLog(@"2");
});
dispatch_async(serialQueue3, ^{
NSLog(@"3");
});
dispatch_async(serialQueue4, ^{
NSLog(@"4");
});
dispatch_async(serialQueue5, ^{
NSLog(@"5");
});
輸出:
2018-07-22 18:41:30.403676+0800 Demo[1843:123760] 1
2018-07-22 18:41:30.403893+0800 Demo[1843:123760] 2
2018-07-22 18:41:30.405137+0800 Demo[1843:123760] 3
2018-07-22 18:41:30.407517+0800 Demo[1843:123760] 4
2018-07-22 18:41:30.409133+0800 Demo[1843:123760] 5
總結:
變更優(yōu)先級柿究,dispatch_set_target_queue函數第二個參數是一個Global Dispatch Queue邮旷,第一個參數的Serial Dispatch Queue的優(yōu)先級變更為Global Dispatch Queue的優(yōu)先級。
作為執(zhí)行階層蝇摸,多個Serial Dispatch Queue用dispatch_set_target_queue函數指定第二個參數為同一個Serial Dispatch Queue婶肩。