无法在NSURLSession委托方法中更新用户界面

时间:2014-02-10 14:00:48

标签: ios objective-c ios7 nsurlsession

- (void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask
 *)downloadTask didWriteData:(int64_t)bytesWritten totalBytesWritten:(int64_t)totalBytesWritten totalBytesExpectedToWrite:(int64_t)totalBytesExpectedToWrite
{
    float progress = (float)((float)totalBytesWritten /(float)totalBytesExpectedToWrite);
    self.progressView.progress = progress;
    self.progressLabel.text = [NSString stringWithFormat:@"%.2f%%", progress*100];
}

我正在通过iOS 7中添加的NSURLSession下载文件。到目前为止一切正常,但由于某种原因,用户界面不会更新。我已经检查过该方法正在调用,我也可以NSLog进度。

也许是因为这种方法经常被调用?但是,如何更新您的用户界面,例如如果你有进度条呢?在此先感谢:)

2 个答案:

答案 0 :(得分:8)

NSURLSession默认在后台线程中运行,因此您需要在主线程上调用UI更新。

dispatch_async(dispatch_get_main_queue(), ^{
    // perform on main
    float progress = (float)((float)totalBytesWritten /(float)totalBytesExpectedToWrite);
    self.progressView.progress = progress;
    self.progressLabel.text = [NSString stringWithFormat:@"%.2f%%", progress*100];
});

答案 1 :(得分:0)

在对Martin的回答的评论中,Duncan C问了

  

(I)找不到NSURLSession的明确声明   委托方法是从后台线程调用的。你知道吗   如果文档在某处明确说明了这一点?

来自NSURLSession.delegateQueue的{​​{3}}:

  

与此会话相关的所有委托方法调用和完成处理程序都在此队列上执行。

如果您未在创建会话时明确设置delegateQueue

  

...会话创建一个串行操作队列,用于执行所有委托方法调用和完成处理程序调用。