等待多个异步任务完成

问题描述:

我喜欢在应用获取新闻和视频时显示加载消息。目前,我有以下代码:等待多个异步任务完成

[MBProgressHUD showHUDAddedTo:self.view animated:YES]; 
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_LOW, 0), ^{ 

     [self loadVersion]; 
     [self loadFeaturedNews]; 
     [self loadFeaturedVideo]; 

     dispatch_async(dispatch_get_main_queue(), ^{ 

      [MBProgressHUD hideHUDForView:self.view animated:YES]; 

      [self dismissViewControllerAnimated:NO completion:nil]; 

     }); 
    }); 

我想辞退控制器和隐藏,只有当所有任务(新闻,视频)被加载进度视图。

后要执行,你可能想看看enqueueBatchOfHTTPRequestOperations。我会推荐你​​到AFNetworking FAQ

我如何等待一组请求完成处理之前?

使用[enqueueBatchOfHTTPRequestOperationsWithRequests]或[enqueueBatchOfHTTPRequestOperations]将一系列请求一起批处理,指定所有请求完成时的回调。如等待完成块完成的问题中所述,您可能不希望为每个单独的操作设置完成块,而是直接在批量完成块中访问响应对象属性。


我推测,loadVersionloadFeaturedNewsloadFeaturedVideo方法均为异步下载内容。如果您使用NSURLConnection,我会建议将它们更改为同步操作。解决方案的细节取决于你当前如何在这些例程中下载东西,例如如果您使用NSURLConnection方法,initWithRequest,则可以使用sendSynchronousRequest

就我个人而言,我倾向于将它与请求调度组或NSOperationQueue依赖关系同时执行请求结合起来,但首先关注让它们同步运行。我实际上使用了NSOperationQueue,所以我可以轻松地将并发操作的数量限制为四个,或者这样的合理的东西。

顺便说一句,我不建议你改变你的问题中的代码。保持dispatch_async。我建议您将loadVersionloadFeaturedNewsloadFeaturedVideo方法本身修复为同步操作。

+0

我正在使用AFNetworking,但我可以尝试同步拨打电话! – azamsharp 2013-02-12 18:59:05

+1

@azamsharp在这种情况下,我可能会收回我的评论,并建议您查看“AFNetworking”[FAQ](https:// github。com/AFNetworking/AFNetworking/wiki/AFNetworking-FAQ),其标题为“在处理它们之前如何等待一组请求完成?”。 – Rob 2013-02-12 19:23:23

然后使用完成处理程序为此。在你可以写你的代码是如果你使用AFNetworking完成

completion:^ (BOOL finished) { 

    } 
+0

如果有10个任务,并且我想确保所有10个任务都完成,那么它将涉及10个完成处理程序。 – azamsharp 2013-02-12 18:15:08

+0

你可以在单个处理程序中包含这10个任务 – 2013-02-12 18:18:38

+0

dispatch_async没有完成处理程序 – azamsharp 2013-02-12 18:19:21