处理多个异步请求的iOS方法:在所有请求完成时发送一个信号

6
所以我正在浏览Stack Overflow上的内容,寻找有效地处理异步请求的方法。目前我正在使用ASIHTTPRequest,我的应用程序使用REST API,其中对单个资源的请求提示我请求5个或更多附加资源(链接资源)。
目前我正在一个巨大的方法中执行所有异步请求,可能会有大约6个异步请求,每个请求都有其setCompletionBlock和setFailBlock。如果您使用过ASIHTTPRequest,您必须知道那将需要多少重复代码。
无论如何,我似乎已经找到了解决方案,可以通过这个答案确定是否完成所有请求: Multiple asynchronous URL requests 然而,我不知道如何在代码中应用该答案,因为我以前没有使用过推送通知,并且我始终将“self”作为委托而不是其他类。
有什么想法可以将答案应用于代码中,或者更好的是,您是否知道其他方法?
提前感谢!
2个回答

4

当你尝试在6及以上的iOS应用中导入这个库时,它会抛出很多ARC错误。 - Nitin Agarwal

3

使用带有dispatch_group_wait的GCD组。

示例:

__block NSMutableArray *imageURLList = [NSMutableArray array];

dispatch_group_t group = dispatch_group_create();
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);

for (Helper *siteURL in list) {
    dispatch_group_async(group, queue, ^{
        NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:siteURL]];
        NSURLResponse *response;
        NSError *error;
        NSData *urlData = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error];
        if (urlData.length)
            [imageURLList urlData];
    });
}

dispatch_group_wait(group, DISPATCH_TIME_FOREVER);

请注意,此块是异步执行的,因此可以使用sendSynchronousRequest:

实际上,您仍然不应该这样做。除了无法进行即时解析之外,还无法处理代理或其他身份验证,并且操作无法取消。 - Cameron Lowell Palmer
这段代码非常适合执行数十个GET请求。我在我的代码中唯一做的修改是删除了同步的dispatch_group_wait()函数,因为它会冻结主线程。由于我正在执行150多个异步请求,而那些花费很长时间的请求会使应用程序处于冻结状态,所以这给我带来了问题。没有等待也可以使应用程序正常运行(并且所有请求都完成)。对于RESTful调用,请求最终会超时,因此我认为最后一行代码实际上并不必要。但我肯定愿意讨论这个问题。 - ArtSabintsev

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接