我应该选择 URLSessionDataTask 还是 URLSessionDownloadTask 来获取图像

Should I choose URLSessionDataTask or URLSessionDownloadTask for getting image

我使用 URLSessionURLSessionDataTask 从服务器获取图像并将其显示在应用程序中。我看了here。看起来 URLSessionDownloadTask 有更多选择。

目前我使用以下代码获取图像:

let task = URLSession.shared.dataTask(with: url) {(data, response, error) in

    guard error == nil else {
        completion(error, nil)
        return
    }

    completion(nil, data)            
}        
task.resume()

我希望能够暂停、取消和恢复从服务器获取图像的过程。我在文档中看到 URLSessionDataTask 也有这些选项。但是它也是为 URLSessionTask 的 suspend 方法编写的:

A download task can continue transferring data at a later time. All other tasks must start over when resumed.

所以我的问题是:如果我需要能够在某个时候停止获取图像并稍后恢复而不丢失当前进度,我是否应该更改实现以使用 URLSessionDownloadTask 获取图像?提前谢谢你。

NSURLSessionDataTask : 数据任务使用 NSData 交换数据。后台会话不支持 NSURLSessionDataTask,因为它不会以本地文件(存储在内存中)的形式写入内容。因此以后无法恢复。

NSURLSessionDownloadTask : NSURLSessionDownloadTask 直接将响应数据写入临时文件。当应用程序不是 运行 并且在您的情况下允许恢复下载时它支持后台下载。

问题是您为什么要恢复下载您正尝试在应用程序中显示的 "image"。它会改变吗?或者在整个应用程序中它总是一样的吗?如果它将来有机会改变,我认为你应该坚持 URLSessionDataTask 因为我认为它会耗尽本地存储空间来一遍又一遍地下载和写入图像。

使用 NSURLSessionDownloadTask 的风险在于,在下载之前,您必须检查设备上可用的下载 space 是否足以继续进行,在换句话说,必须处理 fileSize 错误,因为苹果认为由开发人员来满足这些要求

是的,如果您想恢复挂起的任务,下载任务可以让它从中断的地方恢复。

您可能想要使用下载任务的其他原因包括:

  • 峰值内存使用率较低,因为下载任务会将数据写入临时文件,而数据任务会将完整资源保存在内存中;和

  • 对于下载任务,您可以使用URLSessionConfiguration.background以便即使在用户离开您的应用后下载仍会继续。