我已经创建了一个使用downloadProgress和响应完成处理程序的下载处理程序,但我想将其转换为Swift 5.5的新异步/等待语法,因为AlamoFire发布了一个支持Swift并发的版本。
这是我当前使用完成处理程序的代码
func startDownload() {
let destination = DownloadRequest.suggestedDownloadDestination(for: .documentDirectory)
AF.download("https://speed.hetzner.de/1GB.bin", to: destination)
.downloadProgress { progress in
print(progress.fractionCompleted)
}
.response { response in
print(response)
}
}
以下是我尝试转换为async/await语法,但我不确定如何实现downloadProgress
func startDownload() async {
let destination = DownloadRequest.suggestedDownloadDestination(for: .documentDirectory)
let downloadTask = AF.download("https://speed.hetzner.de/1GB.bin", to: destination).serializingDownloadedFileURL()
do {
let fileUrl = try await downloadTask.value
print(fileUrl)
} catch {
print("Download error! (error.localizedDescription)")
}
}
如果有任何帮助,我将不胜感激。
您可以继续使用现有的downloadProgress
处理程序,不需要切换到新的语法,尤其是这样做看起来非常相似。
let task = AF.download("https://speed.hetzner.de/1GB.bin", to: destination)
.downloadProgress { progress in
print(progress.fractionCompleted)
}
.serializingDownloadedFileURL()
或者,您可以获取Progress
流,并在单独的Task
中等待值。
let request = AF.download("https://speed.hetzner.de/1GB.bin", to: destination)
Task {
for await progress in request.downloadProgress() {
print(progress)
}
}
let task = request.serializingDownloadedFileURL()
此外,除非使用process.totalUnitCount > 0
,否则您不应该使用progress.fractionCompleted
,否则当服务器不返回进度可以用于totalUnitCount
的Content-Length
标头时,您将无法获得合理的值。