This question already has answers here:
Managing multiple asynchronous NSURLConnection connections
                                
                                    (13个回答)
                                
                        
                                5年前关闭。
            
                    
我有两个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];
}


那是我做的正确吗?我应该在两个NSURLRequest之间添加一个小间隔吗?

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

最佳答案

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

我想您可以使这两种方法同步(在A完成之前不要启动B),但是我认为确实没有必要这样做。

好消息是NSURLConnectionDelegate回调函数将您传递给NSURLConnection对象,因此您可以使用该对象确定是要响应A还是响应B。该信息应告诉您是否将数据放入A中或B网络数据对象,以及在请求完成后是否更新表视图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,但是以上两个应该为您提供一般解决方案的一个很好的例子。

10-08 01:56