使用 Dispatch Group
最近在业务逻辑中实践了一下大中枢派发。简单的串行异步队列通常不能满足需求, 比如你要在多个异步任务完成后才进行某个操作.
Group 的创建
dispatch_group_t group = dispatch_group_create();
这没什么好说的.
任务的添加
方法一
dispatch_group_async(group, dispatch_get_main_queue(), ^{
NSLog(@"foo");
});
dispatch_group_async(group, dispatch_get_main_queue(), ^{
NSLog(@"bar");
});
适用于一些本地逻辑, 比如同时需要查多张表, 全部查完再 reload data 之类的.
方法二
有时候业务的需要是在多个网络请求响应后做一些处理, 而一般我们都会把 HTTP 相关的接口直接封装成异步的, 用上面的方法就会导致变成异步事件中的异步事件.
这时候我们需要下面两个接口:
dispatch_group_enter(group);
dispatch_group_leave(group);
需要注意的是, 这两个接口一定要确保被调用的次数是一致的, 在处理响应结果的逻辑中, 要保证不管哪一种逻辑, 都要考虑到这个一致问题.没猜错的话, 这是信号量实现的, 不一致的话就永远不回调了...
完成后的回调
也有两个接口
dispatch_group_wait(group, DISPATCH_TIME_FOREVER);
dispatch_group_notify(group, dispatch_get_main_queue(), ^{
NSLog(@"finished.");
});
阻塞方式
这个接口会阻塞当前队列, 第二个参数表示等待时间.
dispatch_group_wait(group, DISPATCH_TIME_FOREVER);
异步方式
这个就是非阻塞了, 通过 block 传入回调函数, 之后的代码继续执行.
dispatch_group_notify(group, dispatch_get_main_queue(), ^{
NSLog(@"finished.");
});