多个ASIHTTP请求

时间:2012-09-24 19:51:50

标签: ios asihttprequest

我意识到这两个网址不会同时返回数据。我想知道如何确保网址同时返回。我怎么能将此代码更改为GCD。这是推荐的吗?我在代码中创建了调度队列,但它没有绘制任何东西,没有工作。没有GCD它可以工作,但它不会同时返回。任何帮助将不胜感激!

-(void)httpRequest{

_weak ASIHTTPRequest *request1 = [ASIHTTPRequest requestWithURL:url1];
[request1 setCompletionBlock:^{
    NSString *responseString1 = [request1 responseString];
//dispatch_async(backgroundProcess1,^(void){
    [self plotOverlay1:responseString1];
 //});
}];
[request1 setFailedBlock:^{
    NSError *error=[request1 error];
    NSLog(@"Error: %@", error.localizedDescription);
}]; 

[request1 startAsynchronous];


_weak ASIHTTPRequest *request2 = [ASIHTTPRequest requestWithURL:url2];
[request2 setCompletionBlock:^{
    NSString *responseString2 = [request2 responseString];
 //dispatch_async(backgroundProcess2,^(void){
    [self plotOverlay2:responseString2];
  //});
}];
[request2 setFailedBlock:^{
    NSError *error=[request2 error];
    NSLog(@"Error: %@", error.localizedDescription);
}]; 

[request2 startAsynchronous];


}

1 个答案:

答案 0 :(得分:1)

您无法保证两个独立的异步请求会同时返回。

一种解决方案是链接请求 - 换句话说,在第一个请求的完成块中启动第二个请求 - 然后在第二个请求的完成块中处理两个请求。

允许两个请求并行运行的另一种方法是在类上创建属性以保存请求的响应。在请求完成处理程序中,您可以将相应的属性设置为响应字符串的值,然后调用新方法。该方法将检查两个请求的responseString属性是否具有值,如果是,则进行处理,如果不是,则不执行任何操作。这样,只要一个请求完成就不会发生任何事情(并且无论哪个完成都没关系),但是一旦另一个请求也完成,您的处理将完成(对于两个请求)。

-(void)httpRequest
{
    _weak ASIHTTPRequest *request1 = [ASIHTTPRequest requestWithURL:url1];
    [request1 setCompletionBlock:^{
        self.responseString1 = [request1 responseString];
        [self checkIfBothRequestsComplete];
    }];
    [request1 startAsynchronous];

    _weak ASIHTTPRequest *request2 = [ASIHTTPRequest requestWithURL:url2];
    [request2 setCompletionBlock:^{
        self.responseString2 = [request2 responseString];
        [self checkIfBothRequestsComplete];
    }];
    [request2 startAsynchronous];
}

- (void)checkIfBothRequestsComplete
{
    if (self.responseString1 && self.responseString2) {
        [self plotOverlay1:self.responseString1];
        [self plotOverlay2:self.responseString2];
    }

}