iOS开发系列-线程同步dispatch_set_target_queue

dispatch_set_target_queue除了能用来设置队列的优先级之外,还能够创建队列的层次体系,当我们想让不同队列中的任务同步的执行时,我们可以创建一个串行队列,然后将这些队列的target指向新创建的队列即可,比如

队列层次体系.png

dispatch_queue_t targetQueue=dispatch_queue_create("targetQueue",DISPATCH_QUEUE_SERIAL);//目标队列

dispatch_queue_t queue1=dispatch_queue_create("queue1",DISPATCH_QUEUE_SERIAL);//串行队列

dispatch_queue_t queue2=dispatch_queue_create("queue1",DISPATCH_QUEUE_CONCURRENT);//并发队列//设置参考

dispatch_set_target_queue(queue1,targetQueue);

dispatch_set_target_queue(queue2,targetQueue);

dispatch_async(queue2,^{NSLog(@"job3 in");

[NSThread sleepForTimeInterval:2.f];

NSLog(@"job3 out");

});

dispatch_async(queue2,^{

NSLog(@"job2 in");

[NSThread sleepForTimeInterval:1.f];

NSLog(@"job2 out");});

dispatch_async(queue1,^{

NSLog(@"job1 in");

[NSThread sleepForTimeInterval:3.f];

NSLog(@"job1 out");

});

输出结果:

[3491:1491712] job3 in

[3491:1491712] job3 out

[3491:1491712] job2 in

[3491:1491712] job2 out

[3491:1491712] job1 in

[3491:1491712] job1 out

总结:

通过打印的结果说明我们设置了queue1和queue2队列以targetQueue队列为参照对象,那么queue1和queue2中的任务将按照targetQueue的队列处理。

适用场景:

一般都是把一个任务放到一个串行的queue中,如果这个任务被拆分了,被放置到多个串行的queue中,但实际还是需要这个任务同步执行,那么就会有问题,因为多个串行queue之间是并行的。这时候dispatch_set_target_queue将起到作用。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容