0

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

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

        });
    });

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

4

2 回答 2

1

如果您使用的是 AFNetworking,您可能需要查看enqueueBatchOfHTTPRequestOperations. 我建议您参考AFNetworking 常见问题解答

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

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


我收集到loadVersion,loadFeaturedNewsloadFeaturedVideo方法都是异步下载内容。如果您使用的是NSURLConnection,我建议您将它们更改为同步操作。解决方案的具体细节将根据您当前在这些例程中下载内容的方式而有所不同,例如,如果您正在使用NSURLConnection方法initWithRequest,您可以使用sendSynchronousRequest.

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

顺便说一句,我根本不建议您更改问题中的代码。保持那个dispatch_async。我建议您自己修复loadVersionloadFeaturedNewsloadFeaturedVideo方法,使其同步运行。

于 2013-02-12T18:48:36.863 回答
0

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

completion:^ (BOOL finished) {

    }
于 2013-02-12T18:12:01.947 回答