有这么一个需要,分别执行2个耗时的异步操作,等2个异步操作都执行完毕后在回到主线程执行操作。如果想要快速高效地实现这个需求,可以考虑使用调度组。
调度组的创建代码如下:
-
dispatch_group_t group = dispatch_group_create();
往调度组里面添加任务的函数如下:
-
dispatch_group_async(dispatch_group_t group, dispatch_queue_t queue, ^(void)block)
第一个参数group是一个调度组,queue是一个异步队列,这里如果使用同步队列意义就不大了,不过还是能达到效果,第三个参数是一个执行代码块,任务都添加到该代码块里面。
往调度组里面添加任务并获得通知的代码如下:
-
-
dispatch_group_t group = dispatch_group_create();
-
-
dispatch_queue_t q = dispatch_get_global_queue(0, 0);
-
-
-
dispatch_group_async(group, q, ^{
-
[NSThread sleepForTimeInterval:1.0];
-
NSLog(@"任务1 %@", [NSThread currentThread]);
-
});
-
dispatch_group_async(group, q, ^{
-
NSLog(@"任务2 %@", [NSThread currentThread]);
-
});
-
dispatch_group_async(group, q, ^{
-
NSLog(@"任务3 %@", [NSThread currentThread]);
-
});
-
-
-
dispatch_group_notify(group, dispatch_get_main_queue(), ^{
-
-
NSLog(@"OK %@", [NSThread currentThread]);
-
});
-
-
NSLog(@"come here");
代码的执行结果如下:
其中任务的下载顺序以及"come
here”出现的地方不确定,但主线程的更新操作总会在最后才执行!
GCD调度组中还有一个添加任务的函数:
dispatch_group_enter(dispatch_group_t group)
dispatch_group_leave(dispatch_group_t group)
这两个函数要配对出现
例如:
-
-
dispatch_group_t group = dispatch_group_create();
-
-
dispatch_queue_t q = dispatch_get_global_queue(0, 0);
-
-
-
-
dispatch_group_enter(group);
-
dispatch_async(q, ^{
-
NSLog(@"task1 %@", [NSThread currentThread]);
-
-
-
dispatch_group_leave(group);
-
});
-
-
-
dispatch_group_enter(group);
-
dispatch_async(q, ^{
-
[NSThread sleepForTimeInterval:1.0];
-
-
NSLog(@"task2 %@", [NSThread currentThread]);
-
-
-
dispatch_group_leave(group);
-
});
-
-
-
dispatch_group_notify(group, dispatch_get_main_queue(), ^{
-
NSLog(@"OVER");
-
});
-
NSLog(@"come here");
代码执行的效果与刚才那种方式相同!
GCD中还有一个函数
-
dispatch_group_wait(dispatch_group_t group, dispatch_time_t timeout)
该函数是个阻塞式的等待,当我们将第二个参数设置为DISPATCH_TIME_FOREVER时,群组任务不执行完,后续代码就会无法执行,也就是说只要任务不执行完come
here就不会打印。
ios多线程操作(八)—— GCD调度组
原文:http://blog.csdn.net/wuwuweiweilonglong/article/details/51167210