1.dispatch_group_async、dispatch_group_t与dispatch_group_notify 再配合dispatch_group_enter(group)和dispatch_group_leave(group)两个函数一起来使用,这样才能实现我们想要的最终效果。
2.dispatch_group_enter(dispatch_group_t group);
参数group不能为空,在异步任务开始前调用。它明确的表明了一个block被加入到了队列组group中,此时group中的任务的引用计数会加1(类似于OC的内存管理),dispatch_group_enter(group)必须与dispatch_group_leave(group)配对使用,它们可以在使用dispatch_group_async时帮助你合理的管理队列组中任务的引用计数的增加与减少。
3.dispatch_group_leave(dispatch_group_t group);
参数group不能为空,在异步任务成功返回后调用。它明确的表明了队列组里的一个block已经执行完成,队列组中的任务的引用计数会减1,它必须与dispatch_group_enter(group)配对使用,dispatch_group_leave(group)的调用次数不能多于dispatch_group_enter(group)的调用次数。
当队列组里的任务的引用计数等于0时,会调用dispatch_group_notify函数。具体代码实现如下:
@property(nonatomic,strong) dispatch_group_t disGroup;
- (void)requestDatas {
dispatch_queue_tqueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0); dispatch_group_enter(self.disGroup);
dispatch_group_enter(self.disGroup);
dispatch_group_enter(self.disGroup);
dispatch_group_async(self.disGroup, queue, ^{
[self requestHomeWorks];
});
dispatch_group_async(self.disGroup, queue, ^{
[self requestHomeBanner];
});
dispatch_group_async(self.disGroup, queue, ^{
[self requestHomeAdvInfos];
});
dispatch_group_notify(self.disGroup, dispatch_get_main_queue(), ^{
NSLog(@"4");
[self.collectionView reloadData];
});
}
- (void)requestHomeWorks {
[[SFAPIManager sharedManager] requestDataWithPath:kHomeWorksPath params:nil completeBlock:^(id result,NSError *error) {
NSLog(@"1");
dispatch_group_leave(self.disGroup);
}];
}