AlamoFire将进度完成处理程序下载到async/await



我已经创建了一个使用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,否则当服务器不返回进度可以用于totalUnitCountContent-Length标头时,您将无法获得合理的值。

相关内容

  • 没有找到相关文章

最新更新