0

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

问题是我有一个随机结果,有时第一个显示第一个,有时第二个显示第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];
}

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

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

4

1 回答 1

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作为持久变量,而不是局部变量。看起来您可能正在这样做,但由于您没有出示他们的声明,我只是想确定一下。

当然,您还应该实现其他委托回调,但以上两个应该为您提供一般解决方案的一个很好的示例。

于 2013-03-14T02:02:56.280 回答