gpt4 book ai didi

swift - 如何在 Swift 中获取后台文件下载任务的引用?

转载 作者:搜寻专家 更新时间:2023-11-01 07:04:41 25 4
gpt4 key购买 nike

我能够在后台成功下载文件。应用关闭和应用重新打开时,仍然有数据按预期下载。

但是,为了根据数据下载状态显示 UI,我需要引用实际的后台任务。我特别想知道是否仍有后台任务在运行 - 如果是,我需要对这个特定任务的引用。

我该怎么做??

根据我的阅读,此引用应由首先配置为后台 session 的 downloadSession 自动提供(即 self.downloadService.downloadsSession = self.downloadsSession)。但这并没有以某种方式做到这一点......

此外,我通过 a) 按下模拟器中的停止按钮或 b) 双击 Home 并将应用程序滑出多线程 View 来终止我的应用程序 --> 这对保持后台任务有效吗为下一个应用程序启动?? (至少 didWriteData 方法在关闭 a) 或 b) 时一直触发 - 所以我认为这是可以的)

这是我的代码(从一个更大的项目中摘录 - 但你应该明白这个想法)......

let downloadService = SomeDownloadService()

lazy var downloadsSession: URLSession = {
let configuration = URLSessionConfiguration.background(withIdentifier: "SomeID.BGSessionConfiguration")
return URLSession(configuration: configuration, delegate: self, delegateQueue: nil)
}()

override func viewDidLoad() {
super.viewDidLoad()

self.downloadService.downloadsSession = self.downloadsSession

// ...file is created somewhere else...
self.downloadService.startDownload(file)
// *** Until here everything OK - file starts downloading in the background *******

// *** HOW DO I GET A REFERENCE TO THE BACKGROUND TASK RUNNING ???????
// ????

// *** KEEPS PRINTING 0 *** WHY ?????????????????????????
print(self.downloadService.activeDownloads.count
}

// Updates progress info
// *** WORKS WELL - upon second App-Start there is still data coming in *******
func urlSession(_ session: URLSession, downloadTask: URLSessionDownloadTask,
didWriteData bytesWritten: Int64, totalBytesWritten: Int64,
totalBytesExpectedToWrite: Int64) {

guard let url = downloadTask.originalRequest?.url,
let download = self.downloadService.activeDownloads[url] else {
return
}

download.progress = Float(totalBytesWritten) / Float(totalBytesExpectedToWrite)

let totalSize = ByteCountFormatter.string(fromByteCount: totalBytesExpectedToWrite, countStyle: .file)
}

最佳答案

当您使用 downloadTask(with:) 创建任务时,您将返回一个 URLSessionDownloadTask。只要您的程序仍在运行,您就可以使用该任务来访问下载信息。我相信您的问题是当您的程序终止并重新启动时如何处理这个问题。

每个任务都有一个taskIdentifier。您可以创建一个字典,将标识符映射到对您的内部跟踪有用的任何内容(URL、常量等)。重新启动时,您可以调用 URLSession.shared.getTasksWithCompletionHandler() 来检索所有正在进行的任务,并使用标识符映射回您用来跟踪它们的任何内容。

如果您唯一关心的是 URL,您可以跳过整个标识符步骤,只需使用 originalRequest 来确定您关心的是哪一个。

关于swift - 如何在 Swift 中获取后台文件下载任务的引用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48747354/

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