为什么NSURLConnection会阻止我的UI?

时间:2010-08-10 08:31:46

标签: iphone nsurlconnection nsxmlparser

我一直在阅读有关此问题的几个主题和问题,但我找不到解决方案。

我用

执行了一些异步调用
[NSURLConnection connectionWithRequest:anURLRequest delegate:self];

问题是我希望界面可操作但在连接完成之前它被阻止。

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

修改

好的,在检索数据后,我用NSXMLParser解析它,它同步执行并阻塞主线程。它是否正确?然后,也许我需要解析另一个线程。有人有导游吗?

5 个答案:

答案 0 :(得分:1)

来自文档:

  

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

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

答案 1 :(得分:1)

使用connectionWithRequest时,不应锁定用户界面。尝试在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文档了解详情。

答案 2 :(得分:1)

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

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

答案 3 :(得分:1)

我不知道它是否可以帮助任何人,但我遇到了同样的问题(异步URL请求阻止了用户界面),但原因是:

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

在connectionDidReceiveData方法中。

答案 4 :(得分: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];
}

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