gpt4 book ai didi

swift - 下载状态在重新加载时消失

转载 作者:可可西里 更新时间:2023-11-01 01:08:54 28 4
gpt4 key购买 nike

我有一个从网站下载文件的下载功能。一切都很好,除了当我点击导航 Controller 的后退按钮并尝试重新加载 View Controller 时。下载任务在后台运行良好,但会在第二次重新加载时重置 View 。这是我的代码。

func urlSession(_ session: URLSession, downloadTask: URLSessionDownloadTask,
didWriteData bytesWritten: Int64, totalBytesWritten: Int64,
totalBytesExpectedToWrite: Int64) {
// 1
guard let url = downloadTask.originalRequest?.url,
let download = downloadService.activeDownloads[url] else { return }
// 2
download.progress = Float(totalBytesWritten) / Float(totalBytesExpectedToWrite)
// 3
let totalSize = ByteCountFormatter.string(fromByteCount: totalBytesExpectedToWrite,
countStyle: .file)

// 4
DispatchQueue.main.async {
if let myCell = self.tableView.cellForRow(at: IndexPath(row: Int(download.resource.resourceId - 1) ,
section: 0)) as? TranslationViewCell {
myCell.updateDisplay(progress: download.progress, totalSize: totalSize)
if download.isDownloading == true{
myCell.downloadButton.isHidden = true //this doesnt get activated at all.
myCell.reloadInputViews()
}
}
}
}

如果下载在后台运行,我试图隐藏下载按钮。

最佳答案

当 View Controller 从堆栈中弹出时,它会被释放。这意味着您在代码中引用的“self”不再存在,这使得无法更新 View 。

为了第二次正确加载 View ,您需要在不会被释放的代码中保留下载任务,或者使用事件之类的东西来响应下载任务本身。

此时我们可以深入讨论 iOS 应用架构;但是我会给你我最喜欢的选项来让它工作。

发送通知而不是直接与 TableView 交互。代码可能看起来像这样......

首先为您自己的应用扩展通知类:

extension Notification.Name {
static let downloadProgressChanged = Notification.Name("download_progress_changed")
}

然后在回调中发布通知:

DispatchQueue.main.async {
let notificationDict:[String: Download] = ["download": download]
NotificationCenter.default.post(name: .downloadProgressChanged, object: nil, userInfo: userDict)
}

然后你的 View Controller 将需要监听这些通知并适本地更新自己,你应该在 viewDidLoad 中调用它

    // MARK - Notifications
func setupListeners() {
NotificationCenter.default.addObserver(self, selector: #selector(handleProgressChanged(notification:)), name: .downloadProgressChanged, object: nil)
}

@objc func handleProgressChanged(notification: NSNotification) {
if let download = notification.userInfo?["download"] as? <whatever the class of Download is> {
// update the tableview here
}
}

现在你有了一个 View Controller ,它可以适本地响应这个下载任务,而不需要知道任何关于任务的信息。

关于swift - 下载状态在重新加载时消失,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50161121/

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