我试图弄清楚为什么我的 UI 直到我的所有 NSURLConnections 都加载后才更新。
我基本上是在加载一个“登录”请求,接收响应,然后调用:
[[NSNotificationCenter defaultCenter] postNotificationName:@"connectionFinishedLoading" object:[NSMutableDictionary dictionaryWithObject:dataForConnection forKey:conn.tag]]
我在代码的其他地方收到通知,它调用:
[self.loginViewController dismissViewControllerAnimated:YES completion:nil];
连同一个 NSLog,所以我知道它实际上是在正确的时间使用这个方法,它只是在其他基本上与隐藏对话框同时开始的 NSURLConnections 完成之后,视图控制器才被解除。
过去几个小时我一直在研究这个问题,但我仍然不确定我用来创建/发送请求的代码是否异步工作:
-(void)initGET:(NSString *)url queryString:(NSString *)theQueryString tag:(NSString *)tag{
if([Utils CanConnectToURL:url]){
//NSLog(@"url: %@", url);
//NSLog(@"queryString: %@", theQueryString);
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:[NSString stringWithFormat:@"%@?%@", url, theQueryString]]];
[request setHTTPMethod:@"GET"];
[request setValue:@"application/xml; charset=utf-8" forHTTPHeaderField:@"Content-Type"];
[request setTimeoutInterval:60*10];
URLConnection *connection = [[URLConnection alloc] initWithRequest:request delegate:self startImmediately:YES tag:tag];
if(connection){
[receivedData setObject:[NSMutableData data] forKey:connection.tag];
[conns addObject:connection];
}
else
[receivedData setObject:NSLocalizedString(@"ConnectionError", nil) forKey:connection.tag];
}
else{
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:NSLocalizedString(@"NoInternetConnectionTitle", nil) message:NSLocalizedString(@"NoInternetConnectionMessage", nil) delegate:self cancelButtonTitle:NSLocalizedString(@"OK", nil) otherButtonTitles:nil];
alert.tag = 999;
[alert show];
}
}
我的猜测是它已经是异步的,因为我在第一个完成后直接启动了另外 3 个 NSURLConnections,并且我的日志显示其他 3 个连接基本上都是在同一时间开始的,然后都在稍后完成。如果它只是同步的,那么肯定会启动 1 个连接,然后完成,然后是第 2 个连接开始/完成,依此类推......
有谁知道为什么我的 UI 无法正确更新?如果是这样,那么一个好的解决方法是什么 - 我已经对 NSOperationQueue 有所了解,但是在使用 NSNotificationCenter 传递消息/对象时,使用它似乎开始导致其他问题,我在我的 URLConnectionManager 类中使用了很多.
谢谢!
麦克风