等待多个异步任务完成
我喜欢在应用获取新闻和视频时显示加载消息。目前,我有以下代码:等待多个异步任务完成
[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
]将一系列请求一起批处理,指定所有请求完成时的回调。如等待完成块完成的问题中所述,您可能不希望为每个单独的操作设置完成块,而是直接在批量完成块中访问响应对象属性。
我推测,loadVersion
,loadFeaturedNews
和loadFeaturedVideo
方法均为异步下载内容。如果您使用NSURLConnection
,我会建议将它们更改为同步操作。解决方案的细节取决于你当前如何在这些例程中下载东西,例如如果您使用NSURLConnection
方法,initWithRequest
,则可以使用sendSynchronousRequest
。
就我个人而言,我倾向于将它与请求调度组或NSOperationQueue
依赖关系同时执行请求结合起来,但首先关注让它们同步运行。我实际上使用了NSOperationQueue
,所以我可以轻松地将并发操作的数量限制为四个,或者这样的合理的东西。
顺便说一句,我不建议你改变你的问题中的代码。保持dispatch_async
。我建议您将loadVersion
,loadFeaturedNews
和loadFeaturedVideo
方法本身修复为同步操作。
我正在使用AFNetworking,但我可以尝试同步拨打电话! – azamsharp 2013-02-12 18:59:05
@azamsharp在这种情况下,我可能会收回我的评论,并建议您查看“AFNetworking”[FAQ](https:// github。com/AFNetworking/AFNetworking/wiki/AFNetworking-FAQ),其标题为“在处理它们之前如何等待一组请求完成?”。 – Rob 2013-02-12 19:23:23