This question already has answers here:
Managing multiple asynchronous NSURLConnection connections
(13个回答)
5年前关闭。
我有两个
问题是我有一个随机结果,有时第一个显示在第一个,有时第二个
那是我做的正确吗?我应该在两个
因为在每次执行视图时,我都会得到一个随机结果。 (我将结果设置为两个
此解决方案要求您将
您还应该implement the other delegate callbacks, of course,但是以上两个应该为您提供一般解决方案的一个很好的例子。
(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
}
此解决方案要求您将
connectiona
和connectionb
保留为永久ivars,而不是发布代码中的局部变量。看来您可能正在这样做,但是由于您没有显示他们的声明,所以我只是想确定一下。您还应该implement the other delegate callbacks, of course,但是以上两个应该为您提供一般解决方案的一个很好的例子。
10-08 01:56