GCD队列组的简单使用

2016-08-23  本文已影响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.根据需求可以自由选择两种方法中的一种.
©如果有出错的地方,欢迎留言.

上一篇 下一篇

猜你喜欢

热点阅读