dispatch_set_target_queue
变更生成的Dispatch Queue的执行优先级
dispatch_queue_create生成的Dispatch Queue不管是Serial Dispatch Queue还是Concurrent Dispatch Queue,都使用与默认优先级Global Dispatch Queue相同的执行优先级的线程.而变更生成的Dispatch Queue的执行优先级要使用dispatch_set_target_queue函数.在后台执行动作处理的Serial Dispatch Queue的生成方法如下:
dispatch_queue_t mySerialDispatchQueue = dispatch_queue_create("com.example.gcd.mySerialDispatchQueue", NULL);
dispatch_queue_t globalDispatchQueueBackground = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0);
dispatch_set_target_queue(mySerialDispatchQueue, globalDispatchQueueBackground);
指令要变更执行优先优先级的Dispatch Queue为dispatch_set_target_queue函数的第一个参数,指定与要使用的执行优先级相同优先级的Global Dispatch Queue 为第二个参数(目标).第一个参数如果指定系统提供的Main Dispatch Queue 和 Global Dispatch Queue 则不知道会出现什么状况,因此这些均不可指定.
将Dispatch Queue 指定为dispatch_set_target_queue函数的参数,不仅可以变更Dispatch Queue 的执行优先级,还可以作成Dispatch_queue的执行阶层.如果在多个Serial Dispatch Queue 中用dispatch_set_target_queue函数指定目标为摸一个Serial Dispatch Queue,那么原本应该并行执行的多个Serial Dispatch Queue,在目标Serial Dispatch Queue上只能同时执行一个处理.
在必须将不可并行执行的处理追加到多个Serial Dispatch Queue 中时,如果使用dispatch_set_target_queue函数将目标指定为某一个Serial Dispatch Queue,既可防止处理并行执行.
//例:
dispatch_queue_t serial = dispatch_queue_create("com.gcd.serial1", DISPATCH_QUEUE_SERIAL);
dispatch_queue_t serial2 = dispatch_queue_create("com.gcd.serial2", DISPATCH_QUEUE_SERIAL);
// dispatch_set_target_queue(serial2, serial);
dispatch_queue_t serial3 = dispatch_queue_create("com.gcd.serial3", DISPATCH_QUEUE_SERIAL);
// dispatch_set_target_queue(serial3, serial);
dispatch_queue_t serial4 = dispatch_queue_create("com.gcd.serial4", DISPATCH_QUEUE_SERIAL);
// dispatch_set_target_queue(serial4, serial);
dispatch_async(serial2, ^{
sleep(2);
NSLog(@"2");
});
dispatch_async(serial4, ^{
sleep(2);
NSLog(@"4");
});
dispatch_async(serial3, ^{
sleep(2);
NSLog(@"3");
});
执行结果:
2017-08-15 17:06:29.897 GCDDemo[17002:3581660] 4
2017-08-15 17:06:29.897 GCDDemo[17002:3581685] 2
2017-08-15 17:06:29.897 GCDDemo[17002:3581662] 3
dispatch_queue_t serial = dispatch_queue_create("com.gcd.serial1", DISPATCH_QUEUE_SERIAL);
dispatch_queue_t serial2 = dispatch_queue_create("com.gcd.serial2", DISPATCH_QUEUE_SERIAL);
dispatch_set_target_queue(serial2, serial);
dispatch_queue_t serial3 = dispatch_queue_create("com.gcd.serial3", DISPATCH_QUEUE_SERIAL);
dispatch_set_target_queue(serial3, serial);
dispatch_queue_t serial4 = dispatch_queue_create("com.gcd.serial4", DISPATCH_QUEUE_SERIAL);
dispatch_set_target_queue(serial4, serial);
dispatch_async(serial2, ^{
sleep(2);
NSLog(@"2");
});
dispatch_async(serial4, ^{
sleep(2);
NSLog(@"4");
});
dispatch_async(serial3, ^{
sleep(2);
NSLog(@"3");
});
执行结果:
2017-08-15 17:07:58.357 GCDDemo[17030:3592320] 2
2017-08-15 17:08:00.357 GCDDemo[17030:3592320] 4
2017-08-15 17:08:02.359 GCDDemo[17030:3592320] 3