iOS处理多个异步请求:在完成所有请求后发送信号

时间:2011-09-19 23:49:55

标签: iphone ios http asynchronous asihttprequest

所以我正在浏览Stack Overflow以了解有效处理异步请求的方法。现在我正在使用ASIHTTPRequest,我的应用程序使用REST API,其中对单个资源的请求提示我请求5个或更多其他资源(链接资源)。

现在我在一个巨大的方法中做所有异步请求,可能有大约6个异步请求,每个都有他们的setCompletionBlock和setFailBlock。如果您使用过ASIHTTPRequest,则必须知道将采用多少重复代码。

无论如何,我似乎找到了一个解决方案,以确定是否所有请求都已完成此答案: Multiple asynchronous URL requests

但是,我不知道如何在代码中应用该答案,因为我之前没有使用过推送通知,而且我一直使用“self”作为委托,而不是其他类。

任何想法如何应用代码或更好的答案,你知道其他任何方法吗?

提前致谢!

2 个答案:

答案 0 :(得分:5)

将所有请求放入ASINetworkQueue:http://allseeing-i.com/ASIHTTPRequest/How-to-use#about_ASINetworkQueues

ASINetworkQueue有一个名为“queueDidFinishSelector”的回调。

答案 1 :(得分:3)

将GCD组与dispatch_group_wait一起使用。

示例:

__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: