假如现在我们有一个需求,需要在后台执行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.根据需求可以自由选择两种方法中的一种.
©如果有出错的地方,欢迎留言.
网友评论