ios多线程操作(八)—— GCD调度组
2016-04-16 11:55
369 查看
有这么一个需要,分别执行2个耗时的异步操作,等2个异步操作都执行完毕后在回到主线程执行操作。如果想要快速高效地实现这个需求,可以考虑使用调度组。
调度组的创建代码如下:
[objc] view
plain copy
dispatch_group_t group = dispatch_group_create();
往调度组里面添加任务的函数如下:
[objc] view
plain copy
dispatch_group_async(dispatch_group_t group, dispatch_queue_t queue, ^(void)block)
第一个参数group是一个调度组,queue是一个异步队列,这里如果使用同步队列意义就不大了,不过还是能达到效果,第三个参数是一个执行代码块,任务都添加到该代码块里面。
往调度组里面添加任务并获得通知的代码如下:
[objc] view
plain copy
// 群组-统一监控一组任务
dispatch_group_t group = dispatch_group_create();
dispatch_queue_t q = dispatch_get_global_queue(0, 0);
// 添加任务
// group 负责监控任务,queue 负责调度任务
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]);
});
// 监听所有任务完成 - 等到 group 中的所有任务执行完毕后,"由队列调度 block 中的任务异步执行!"
dispatch_group_notify(group, dispatch_get_main_queue(), ^{
// 修改为主队列,后台批量下载,结束后,主线程统一更新UI
NSLog(@"OK %@", [NSThread currentThread]);
});
NSLog(@"come here");
代码的执行结果如下:
其中任务的下载顺序以及"come
here”出现的地方不确定,但主线程的更新操作总会在最后才执行!
GCD调度组中还有一个添加任务的函数:
dispatch_group_enter(dispatch_group_t group)
dispatch_group_leave(dispatch_group_t group)
这两个函数要配对出现
例如:
[objc] view
plain copy
// 群组-统一监控一组任务
dispatch_group_t group = dispatch_group_create();
dispatch_queue_t q = dispatch_get_global_queue(0, 0);
// 1> 入组 -> 之后的 block 会被 group 监听
// dispatch_group_enter 一定和 dispatch_group_leave 要配对出现
dispatch_group_enter(group);
dispatch_async(q, ^{
NSLog(@"task1 %@", [NSThread currentThread]);
// block 的末尾,所有任务执行完毕后,添加一个出组
dispatch_group_leave(group);
});
// 再次入组
dispatch_group_enter(group);
dispatch_async(q, ^{
[NSThread sleepForTimeInterval:1.0];
NSLog(@"task2 %@", [NSThread currentThread]);
// block 的末尾,所有任务执行完毕后,添加一个出组
dispatch_group_leave(group);
});
// 群组结束
dispatch_group_notify(group, dispatch_get_main_queue(), ^{
NSLog(@"OVER");
});
NSLog(@"come here");
代码执行的效果与刚才那种方式相同!
GCD中还有一个函数
[objc] view
plain copy
dispatch_group_wait(dispatch_group_t group, dispatch_time_t timeout)
该函数是个阻塞式的等待,当我们将第二个参数设置为DISPATCH_TIME_FOREVER时,群组任务不执行完,后续代码就会无法执行,也就是说只要任务不执行完come
here就不会打印。
调度组的创建代码如下:
[objc] view
plain copy
dispatch_group_t group = dispatch_group_create();
往调度组里面添加任务的函数如下:
[objc] view
plain copy
dispatch_group_async(dispatch_group_t group, dispatch_queue_t queue, ^(void)block)
第一个参数group是一个调度组,queue是一个异步队列,这里如果使用同步队列意义就不大了,不过还是能达到效果,第三个参数是一个执行代码块,任务都添加到该代码块里面。
往调度组里面添加任务并获得通知的代码如下:
[objc] view
plain copy
// 群组-统一监控一组任务
dispatch_group_t group = dispatch_group_create();
dispatch_queue_t q = dispatch_get_global_queue(0, 0);
// 添加任务
// group 负责监控任务,queue 负责调度任务
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]);
});
// 监听所有任务完成 - 等到 group 中的所有任务执行完毕后,"由队列调度 block 中的任务异步执行!"
dispatch_group_notify(group, dispatch_get_main_queue(), ^{
// 修改为主队列,后台批量下载,结束后,主线程统一更新UI
NSLog(@"OK %@", [NSThread currentThread]);
});
NSLog(@"come here");
代码的执行结果如下:
其中任务的下载顺序以及"come
here”出现的地方不确定,但主线程的更新操作总会在最后才执行!
GCD调度组中还有一个添加任务的函数:
dispatch_group_enter(dispatch_group_t group)
dispatch_group_leave(dispatch_group_t group)
这两个函数要配对出现
例如:
[objc] view
plain copy
// 群组-统一监控一组任务
dispatch_group_t group = dispatch_group_create();
dispatch_queue_t q = dispatch_get_global_queue(0, 0);
// 1> 入组 -> 之后的 block 会被 group 监听
// dispatch_group_enter 一定和 dispatch_group_leave 要配对出现
dispatch_group_enter(group);
dispatch_async(q, ^{
NSLog(@"task1 %@", [NSThread currentThread]);
// block 的末尾,所有任务执行完毕后,添加一个出组
dispatch_group_leave(group);
});
// 再次入组
dispatch_group_enter(group);
dispatch_async(q, ^{
[NSThread sleepForTimeInterval:1.0];
NSLog(@"task2 %@", [NSThread currentThread]);
// block 的末尾,所有任务执行完毕后,添加一个出组
dispatch_group_leave(group);
});
// 群组结束
dispatch_group_notify(group, dispatch_get_main_queue(), ^{
NSLog(@"OVER");
});
NSLog(@"come here");
代码执行的效果与刚才那种方式相同!
GCD中还有一个函数
[objc] view
plain copy
dispatch_group_wait(dispatch_group_t group, dispatch_time_t timeout)
该函数是个阻塞式的等待,当我们将第二个参数设置为DISPATCH_TIME_FOREVER时,群组任务不执行完,后续代码就会无法执行,也就是说只要任务不执行完come
here就不会打印。
相关文章推荐
- ios多线程操作(七)—— GCD延迟操作与一次性代码
- ios多线程操作(六)—— GCD全局队列与主队列
- ios多线程操作(五)—— GCD串行队列与并发队列
- ios多线程操作(四)—— GCD核心概念
- ios多线程操作(三)—— 线程通讯
- ios多线程操作(二)—— NSThread的应用
- ios多线程操作(一)—— 多线程基础与原理
- iOS远程通知的实现机制
- iOS- 利用AFNetworking3.0+(最新AFN) - 实现文件断点下载
- 关于iOS内购
- 利用IOS的异常处理机制来做崩溃统计分析
- iOS CocoaPods安装和使用
- IOS开发 - Info.plist跟pch文件的作用
- ios互斥锁,线程同步
- IOS开发-读取xib文件
- IOS学习之——ViewController之间双向传值(反向为代理模式)
- IOS学习之——ViewController之间正向传值
- iOS 开发 Pch 文件的正确使用
- 【iOS】代码片段库
- 不是行业饱和了,是你对行业不饱和