gpt4 book ai didi

swift - UI 更新不适用于 urlSession downloadTask didWriteData

转载 作者:行者123 更新时间:2023-11-30 12:02:50 39 4
gpt4 key购买 nike

目前,我在使用下载任务时遇到了用户界面更新问题。以下函数应该更新用户界面,但它有时会起作用。为什么每次下载文件时都不起作用?每次调试器中都会显示 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))");
}
}
}

progressLabelprogressView 此时均可用。

顺便说一句,我已经用同一个文件多次测试过,有时有效,有时无效。

更新:我读到了有关使用第二个这样的调度队列的内容

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。

关于swift - UI 更新不适用于 urlSession downloadTask didWriteData,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46999818/

39 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com