等待多个异步任务完成

时间:2013-02-12 18:09:31

标签: ios

我想在应用获取新闻和视频时显示加载消息。目前,我有以下代码:

 [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];

        });
    });

我想解除控制器并仅在加载所有任务(新闻,视频)时隐藏进度视图。

2 个答案:

答案 0 :(得分:1)

如果您正在使用AFNetworking,则可能需要查看enqueueBatchOfHTTPRequestOperations。我会推荐你​​AFNetworking FAQ

  

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

     

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


我认为loadVersionloadFeaturedNewsloadFeaturedVideo方法都是异步下载内容。如果您使用NSURLConnection,我建议您将其更改为同步操作。解决方案的细节将根据您当前在这些例程中下载内容的方式而有所不同,例如:如果您使用NSURLConnection方法initWithRequest,则可以使用sendSynchronousRequest

就个人而言,我倾向于将其与发送组或NSOperationQueue依赖项同时执行请求相结合,但首先要集中精力让它们同步运行。我实际上使用NSOperationQueue因此我可以很容易地将并发操作的数量限制为四个,或类似的那样。

顺便说一句,我建议你不要改变你问题中的代码。保留dispatch_async。我建议您自行修复loadVersionloadFeaturedNewsloadFeaturedVideo方法,以便同步操作。

答案 1 :(得分:0)

然后使用完成处理程序。因为你可以编写完成后要执行的代码

completion:^ (BOOL finished) {

    }