我有两个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
个对象。)
答案 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
}
此解决方案要求您将connectiona
和connectionb
保留为持久 ivars ,而不是您发布的代码中的本地变量。看起来你可能正在这样做,但由于你没有展示他们的声明,我只是想确定。
您还应implement the other delegate callbacks, of course,但上述两个应该为您提供一般解决方案的良好示例。