处理多个NSURLRequest

时间:2013-03-14 00:31:08

标签: ios ios6 nsurlrequest

我有两个NSURLRequest个对象,连接到一个Web服务并调用两个不同的服务。

问题是我有随机结果,有时第一个显示第一个,有时第二个NSURLRequest是第一个。

NSString *urla=@"http://localhost:8080/stmanagement/management/retrieve_dataA/?match_link=";
NSString *uria = [urla stringByAppendingString:self.lien_match];
NSURL *urlla= [ NSURL URLWithString:uria];
NSURLRequest *requesta =[ NSURLRequest requestWithURL:urlla];

NSString *urlb=@"http://localhost:8080/stmanagement/management/retrieve_dataB/?match_link=";
NSString *urib = [urlb stringByAppendingString:self.lien_match];
NSURL *urllb= [ NSURL URLWithString:urib];
NSURLRequest *requestb =[ NSURLRequest requestWithURL:urllb];

connectiona=[NSURLConnection connectionWithRequest:requesta delegate:self];
connectionb=[NSURLConnection connectionWithRequest:requestb delegate:self];

if (connectiona){
    webDataa=[[NSMutableData alloc]init];
}

if (connectionb){
    webDatab=[[NSMutableData alloc]init];
}

这是正确的我正在做什么?我应该在两个NSURLRequest之间添加一个小的中断吗?

因为在每个视图执行时我都有一个随机结果。 (我将结果设置为两个UITableView个对象。)

1 个答案:

答案 0 :(得分:2)

我认为您的“问题”是self是连接两者的连接委托。这些类型的连接是异步,因此无法保证A在B之前完成。您的代码应该处理Web服务器返回数据的任何顺序。

我想你可以使两个方法同步(在A完成之前不要启动B),但我认为没有任何需要来做到这一点

好消息是NSURLConnectionDelegate回调会将NSURLConnection对象传递给您,因此您可以使用它来确定您是否收到对A或B的回复。该信息应该告诉您是否将数据放入A或B Web数据对象,以及在请求完成时是否更新表视图A或B.例如:

- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data
{
    // determine which request/connection this is for
    if (connection == connectiona) {
        [webDataa appendData: data];
    } else if (connection == connectionb) {
        [webDatab appendData: data];
    }
}

- (void)connectionDidFinishLoading:(NSURLConnection *)connection
{
    // determine which request/connection this is for
    if (connection == connectiona) {
        NSLog(@"Succeeded! Received %d bytes of data",[webDataa length]); 
        // TODO(?): update the data source for UITableView (A) and call:
        [tableViewA reloadData];  
    } else if (connection == connectionb) {
        NSLog(@"Succeeded! Received %d bytes of data",[webDatab length]);   
        // TODO(?): update the data source for UITableView (B) and call:
        [tableViewB reloadData];  
    }

    // release the connection* and webData* objects if not using ARC,
    //  otherwise probably just set them to nil
}

此解决方案要求您将connectionaconnectionb保留为持久 ivars ,而不是您发布的代码中的本地变量。看起来你可能正在这样做,但由于你没有展示他们的声明,我只是想确定。

您还应implement the other delegate callbacks, of course,但上述两个应该为您提供一般解决方案的良好示例。