UI 更新不适用于 urlSession downloadTask didWriteData
UI update not working for urlSession downloadTask didWriteData
目前,我在使用下载任务时遇到了用户界面更新的问题。以下函数应该更新用户界面,但它有时会起作用。为什么我每次下载文件都不起作用? NSLog
的日志每次都显示在调试器中!
func urlSession(_ session: URLSession, downloadTask: URLSessionDownloadTask, didWriteData bytesWritten: Int64, totalBytesWritten: Int64, totalBytesExpectedToWrite: Int64) {
let curDownloadSize = totalBytesWritten / (1024*1024)
let totalDownloadSize = totalBytesExpectedToWrite / (1024*1024)
if curDownloadSize != oldDownloadSize {
DispatchQueue.main.async {
self.progressLabel!.text = "\(self.curDownloadSize)MB / \(self.totalDownloadSize)MB"
self.progressView!.progress = Float(totalBytesWritten) / Float(totalBytesExpectedToWrite)
NSLog("Download progress: \(Float(totalBytesWritten) / Float(totalBytesExpectedToWrite))");
}
}
}
progressLabel
和 progressView
目前都可用。
顺便说一句,我已经用同一个文件多次测试过它,有时它能工作,有时却不能。
更新:我读到过像这样使用第二个调度队列
DispatchQueue.global(qos: .utility).async {
DispatchQueue.main.async {
(same as above)
}
}
但这有时也有效。
最近,我解决了这个问题。
如果将太多事件推送到主队列,则会出现此问题。它只是在非常好的互联网连接下发生的。在这种情况下,回调被调用得太频繁了。
我的解决方案:
progressCounter += 1
if progressCounter % 30 == 0 {
DispatchQueue.main.async {
self.progressLabel!.text = "\(self.curDownloadSize)MB / \(self.totalDownloadSize)MB"
self.progressView!.progress = Float(totalBytesWritten) / Float(totalBytesExpectedToWrite)
NSLog("Download progress: \(Float(totalBytesWritten) / Float(totalBytesExpectedToWrite))");
}
}
progressCounter
之前已经初始化为0
目前,我在使用下载任务时遇到了用户界面更新的问题。以下函数应该更新用户界面,但它有时会起作用。为什么我每次下载文件都不起作用? NSLog
的日志每次都显示在调试器中!
func urlSession(_ session: URLSession, downloadTask: URLSessionDownloadTask, didWriteData bytesWritten: Int64, totalBytesWritten: Int64, totalBytesExpectedToWrite: Int64) {
let curDownloadSize = totalBytesWritten / (1024*1024)
let totalDownloadSize = totalBytesExpectedToWrite / (1024*1024)
if curDownloadSize != oldDownloadSize {
DispatchQueue.main.async {
self.progressLabel!.text = "\(self.curDownloadSize)MB / \(self.totalDownloadSize)MB"
self.progressView!.progress = Float(totalBytesWritten) / Float(totalBytesExpectedToWrite)
NSLog("Download progress: \(Float(totalBytesWritten) / Float(totalBytesExpectedToWrite))");
}
}
}
progressLabel
和 progressView
目前都可用。
顺便说一句,我已经用同一个文件多次测试过它,有时它能工作,有时却不能。
更新:我读到过像这样使用第二个调度队列
DispatchQueue.global(qos: .utility).async {
DispatchQueue.main.async {
(same as above)
}
}
但这有时也有效。
最近,我解决了这个问题。
如果将太多事件推送到主队列,则会出现此问题。它只是在非常好的互联网连接下发生的。在这种情况下,回调被调用得太频繁了。
我的解决方案:
progressCounter += 1
if progressCounter % 30 == 0 {
DispatchQueue.main.async {
self.progressLabel!.text = "\(self.curDownloadSize)MB / \(self.totalDownloadSize)MB"
self.progressView!.progress = Float(totalBytesWritten) / Float(totalBytesExpectedToWrite)
NSLog("Download progress: \(Float(totalBytesWritten) / Float(totalBytesExpectedToWrite))");
}
}
progressCounter
之前已经初始化为0