美文网首页
GCD队列组的简单使用

GCD队列组的简单使用

作者: 猴代王 | 来源:发表于2016-08-23 10:54 被阅读740次

    假如现在我们有一个需求,需要在后台执行A任务和B任务,当A任务和B任务都执行完毕的时候再回到主线程执行任务C,这个是最常见的多线程使用场景.那么这个如何使用GCD来实现勒?####

    1.利用串行队列和队列组来实现######

    <pre>
    //代码如下
    // 创建一个串行队列
    dispatch_queue_t my_queue = dispatch_queue_create("my_queue", NULL);

    // 创建一个队列组
    dispatch_group_t my_group = dispatch_group_create();
    
    // 在队列组中my_group中的my_queue中添加一个任务A
    dispatch_group_async(my_group, my_queue, ^{
        for (int i = 0; i < 3; i++) {
            NSLog(@" 我是任务 - A - \n%@",[NSThread currentThread]);
        }
    });
    
    // 在队列组中my_group中的my_queue中添加一个任务B
    dispatch_group_async(my_group, my_queue, ^{
        for (int i = 0; i < 3; i++) {
            NSLog(@" 我是任务 - B - \n%@",[NSThread currentThread]);
        }
    });
    
    // 监听my_queue中的任务执行完毕后回到主线程实现任务C
    dispatch_group_notify(my_group, my_queue, ^{
        dispatch_async(dispatch_get_main_queue(), ^{
            NSLog(@" 我是任务 - C - \n%@",[NSThread currentThread]);
        });
    });</pre>
    
    GCD3.png
    2.利用全局并发队列来实现######

    <pre>
    // 获取全局并发队列
    dispatch_queue_t my_queue = dispatch_get_global_queue(0, DISPATCH_QUEUE_PRIORITY_DEFAULT);

    // 创建一个队列组
    dispatch_group_t my_group = dispatch_group_create();
    
    // 在队列组中my_group中的my_queue中添加一个任务A
    dispatch_group_async(my_group, my_queue, ^{
        for (int i = 0; i < 3; i++) {
            NSLog(@" 我是任务 - A - \n%@",[NSThread currentThread]);
        }
    });
    
    // 在队列组中my_group中的my_queue中添加一个任务B
    dispatch_group_async(my_group, my_queue, ^{
        for (int i = 0; i < 3; i++) {
            NSLog(@" 我是任务 - B - \n%@",[NSThread currentThread]);
        }
    });
    
    // 监听my_queue中的任务执行完毕后回到主线程实现任务C
    dispatch_group_notify(my_group, my_queue, ^{
        dispatch_async(dispatch_get_main_queue(), ^{
            NSLog(@" 我是任务 - C - \n%@",[NSThread currentThread]);
        });
    });
    

    </pre>

    GCD3.png

    根据打印的Log,可以发现这两种方式都实现了前面的需求,唯一的区别就是第一种方式是任务A执行完毕后B再执行最后再执行C,第一种方式是A和B基本同时进行,A和B执行完毕后再执行的C.根据需求可以自由选择两种方法中的一种.
    ©如果有出错的地方,欢迎留言.

    相关文章

      网友评论

          本文标题:GCD队列组的简单使用

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