0

我试图弄清楚为什么我的 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 类中使用了很多.

谢谢!

麦克风

4

1 回答 1

0

URLConnection 不是标准的 NSURLConnection。如果没有看到 URLConnection 的实现,很难判断它是否是异步的。

另外,当您收到连接已完成的通知时,您如何更新您的 UI?

于 2012-12-07T11:38:51.080 回答