iOS GCD使用dispatch_set_target_queue

dispatch_set_target_queue

我们发现获取全局队列时,可以设置队列的优先级,但是我们自己创建的队列缺没有设置优先级,如果我们想要设置队列的优先级就需要通过dispatch_set_target_queue方法了。

dispatch_set_target_queue方法传入的两个参数都是队列,第一个是需要修改优先级的队列,它的优先级将会变成与第二个队列一致。

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);

我们自己创建的队列的优先级将会变成和我们获取的全局队列的优先级一致,都是DISPATCH_QUEUE_PRIORITY_HIGH

上面我们讲的是都是并发队列的,如果第二个参数传入的是串行队列?

先来看看将3个串行队列设置目标队列为同一个串行队列,我们知道多个串行队列,如果不是在同一个线程上进行同步执行,那么他们之间的情况是并发的

    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(@"任务1开始");
        sleep(3);
        NSLog(@"任务1完成");
        
    });
    
    dispatch_async(serialQueue2, ^{
        NSLog(@"任务2开始");
        sleep(2);
        NSLog(@"任务2完成");
        
    });
    
    dispatch_async(serialQueue3, ^{
        NSLog(@"任务3开始");
        sleep(1);
        NSLog(@"任务3完成");
        
    });

打印结果如下

15:06:30.725 任务2开始
15:06:30.725 任务3开始
15:06:30.725 任务1开始
15:06:31.729 任务3完成
15:06:32.729 任务2完成
15:06:33.727 任务1完成

从打印记过可以看出3个任务同时进行,但是如果我们将这3个串行队列的目标队列都设置为同一个串行队列呢?

    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(@"任务1开始");
        sleep(3);
        NSLog(@"任务1完成");
        
    });
    
    dispatch_async(serialQueue2, ^{
        NSLog(@"任务2开始");
        sleep(2);
        NSLog(@"任务2完成");
        
    });
    
    dispatch_async(serialQueue3, ^{
        NSLog(@"任务3开始");
        sleep(1);
        NSLog(@"任务3完成");
        
    });

打印结果如下

15:06:40.729 任务1开始
15:06:43.733 任务1完成
15:06:43.733 任务2开始
15:06:45.734 任务2完成
15:06:45.734 任务3开始
15:06:46.734 任务3完成

从打印结果可以看出,3个任务是按顺序执行的,完成一个下一个才开始,dispatch_set_target_queue在串行队列直接的使用效果就是使得被添加到同一串行队列上的队列上的任务按顺序执行,而不是同时进行。

我们在尝试下将3个并发队列的目标队列设置为一个串行队列

    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(@"任务1开始");
        sleep(3);
        NSLog(@"任务1完成");
        
    });
    
    dispatch_async(concurrentQueue2, ^{
        NSLog(@"任务2开始");
        sleep(2);
        NSLog(@"任务2完成");
        
    });
    
    dispatch_async(concurrentQueue3, ^{
        NSLog(@"任务3开始");
        sleep(1);
        NSLog(@"任务3完成");
        
    });

打印结果如下

15:20:25.005 任务1开始
15:20:28.011 任务1完成
15:20:28.011 任务2开始
15:20:30.016 任务2完成
15:20:30.017 任务3开始
15:20:31.018 任务3完成

从结果可以看出,也是顺序执行的,也就是说将多个队列的目标队列设置为同一个串行队列,多个队列上的任务将会按添加任务的顺序进行处理。

ps:这个方法如果是给将主线程、全局队列作为第一个参数的结果未知,对串行队列进行循环设置对方为目标队列的结果暂时未知

总结

dispatch_set_target_queue方法的两个作用:
1.通过全局队列来给我们自己创建的队列设置队列的优先级。
2.可以为多个队列设置同一个串行队列为目标队列,实现多个队列直接的任务按顺序执行。

ps:一直没有想明白第二种情况的使用场景,有想法的朋友麻烦留言交流下

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容