美文网首页线程
iOS开发系列-线程同步dispatch_set_target_

iOS开发系列-线程同步dispatch_set_target_

作者: lltree | 来源:发表于2016-07-04 16:39 被阅读1380次

    本笔记参考该该作者帖子,自己学习,提升使用
    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将起到作用。

    相关文章

      网友评论

      本文标题:iOS开发系列-线程同步dispatch_set_target_

      本文链接:https://www.haomeiwen.com/subject/uwacjttx.html