2010-08-10 92 views
0

我一直在阅读关于这个问题的几个主题和问题,但我没有找到解决方案。为什么NSURLConnection会阻止我的用户界面?

我有

[NSURLConnection connectionWithRequest:anURLRequest delegate:self]; 

的问题进行了一些异步调用是我想要的界面设为有效,但是它被阻塞,直到连接完成。

这解决了启动另一个线程?问题究竟在哪里?

编辑

好吧,以后检索数据我的NSXMLParser解析它,同步做,块主线程。它是否正确?然后,也许我需要解析另一个线程。任何人都有指导?

+0

你用哪种方法执行该调用? – David 2010-08-10 08:46:34

+0

我在根视图控制器的子视图(不是表格)上调用它。 – emenegro 2010-08-10 09:56:16

+0

你应该包含更多的代码。不知道何时以及如何初始化您的连接,很难排除故障。 – thomax 2010-08-10 10:16:21

回答

1

从文档:

消息的代表将调用此方法的线程上发送。为了使连接正常工作,调用线程的运行循环必须以默认运行循环模式运行。

您确定此代码是在默认模式下的运行循环中调用的,而不是您自己创建的线程使用不同类型的运行循环模式?

+0

我不在我的应用程序的任何部分创建任何线程。但我不知道系统是否自己创建另一个线程,并且我错过了这个事情。这可能吗? – emenegro 2010-08-10 08:53:24

1

当您使用connectionWithRequest时,UI不应锁定。尝试建立在你的UI标签,让你的连接与数据的电流量更新它,就像这样:

- (void)downloadContentFromUrl:(NSURL *)url { 
    NSURLRequest *request = [NSURLRequest requestWithURL:url cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:10.0]; 
    NSURLConnection *connection = [[NSURLConnection alloc] initWithRequest:request delegate:self]; 
    if (connection) { 
     receivedData = [[NSMutableData data] retain]; 
     self.downloadProgressLabel.text = @"Downloading..."; 
    } else { 
     // oh noes! 
    } 
} 

- (void) connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response { 
    [receivedData setLength:0]; 
} 

- (void) connection:(NSURLConnection *)connection didReceiveData:(NSData *)data { 
    [receivedData appendData:data]; 
    int kb = [receivedData length]/1024; 
    self.downloadProgressLabel.text = [NSString stringWithFormat:@"Downloaded\n%d kB", kb]; 
} 

connectionWithRequest确实在它自己的线程中运行 - 无需您担心这一点。实际上它必须从主线程开始。查看NSUrlConnection文档了解更多信息。

+0

除了锁定UI之外,它还会延迟事件链直到下载完成。下载后,我接触的所有响应者都会回应。 – emenegro 2010-08-10 09:22:01

+0

我尝试使用标签进行测试,直到下载结束才更新: – emenegro 2010-08-10 09:37:44

1
+ (id)connectionWithRequest:(NSURLRequest *)request delegate:(id)delegate]; 

该方法应该创建一个异步请求(这意味着它在后台运行并且不会阻止UI)。你应该检查你的文件中是否有阻止UI的其他类/方法(例如NSData的'+(NSData *)dataWithContentsOfURL:(NSURL *)URL')。

+0

在我的项目中发生了0次“dataWithContentsOfURL”。虽然,你知道阻止UI的选择器是什么吗?也许我有一个这些在我的代码中。 – emenegro 2010-08-10 10:40:17

+0

嗯,在数据加载之后UI仍然被阻塞(didFinishLoading方法被调用)? – elslooo 2010-08-10 10:47:33

1

我不知道这是否能帮助任何人,但我有同样的问题(异步URL请求阻塞UI),但它是由于:在connectionDidReceiveData方法

NSLog(@"dataReceived: %@", data); 

0

在我的情况下,我试图更新UIProgressView.progress属性。我计算这样的

- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data{ 
    [self.progress setProgress:self.downloadedData.length/self.fileSize ]; 
    [self.downloadedData appendData:data]; 
} 

新的价值不工作,我更换了此代码段与

- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data{ 
    self.downloadedSize += data.length; 
    [self.progress setProgress:self.downloadedSize/self.fileSize ]; 
    [self.downloadedData appendData:data]; 
} 

现在没有问题的进展视图更新。