- - (void)downloadPhotosWithCompletionBlock:(BatchPhotoDownloadingCompletionBlock)completionBlock
- {
- // 1
- __block NSError *error;
- dispatch_group_t downloadGroup = dispatch_group_create();
- for (NSInteger i = 0; i < 3; i++) {
- NSURL *url;
- switch (i) {
- case 0:
- url = [NSURL URLWithString:kOverlyAttachedGirlfriendURLString];
- break;
- case 1:
- url = [NSURL URLWithString:kSuccessKidURLString];
- break;
- case 2:
- url = [NSURL URLWithString:kLotsOfFacesURLString];
- break;
- default:
- break;
- }
- dispatch_group_enter(downloadGroup); // 2
- Photo *photo = [[Photo alloc] initwithURL:url
- withCompletionBlock:^(UIImage *image, NSError *_error) {
- if (_error) {
- error = _error;
- }
- dispatch_group_leave(downloadGroup); // 3
- }];
- [[PhotoManager sharedManager] addPhoto:photo];
- }
- dispatch_group_notify(downloadGroup, dispatch_get_main_queue(), ^{ // 4
- if (completionBlock) {
- completionBlock(error);
- }
- });
- }
-
下面解释新的异步方法如何工作:
1. 在新的实现里,因为你没有阻塞主线程,所以你并不需要将方法包裹在 async 调用中。
2. 同样的 enter 方法,没做任何修改。
3. 同样的 leave 方法,也没做任何修改。
4. dispatch_group_notify 以异步的方式工作。当 Dispatch Group 中没有任何任务时,它就会执行其代码,那么 completionBlock 便会运行。你还指定了运行 completionBlock 的队列,此处,主队列就是你所需要的。
对于这个特定的工作,上面的处理明显更清晰,而且也不会阻塞任何线程。
有a、b、c、d 4个异步请求,如何判断a、b、c、d都完成执行?如果需要a、b、c、d顺序执行,该如何实现?
-
对于这四个异步请求,要判断都执行完成最简单的方式就是通过GCD的group来实现:
123456789dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
dispatch_group_t group = dispatch_group_create();
dispatch_group_async(group, queue, ^{
/*任务a */
});
dispatch_group_async(group, queue, ^{
/*任务b */
});
dispatch_group_async(group, queue, ^{
/*任务c */
});
dispatch_group_async(group, queue, ^{
/*任务d */
});
dispatch_group_notify(group,dispatch_get_main_queue(), ^{
// 在a、b、c、d异步执行完成后,会回调这里
});
-
iOS 多个网络请求全部完成后再刷新
最新推荐文章于 2024-03-27 16:13:10 发布