【问题标题】:Should I choose URLSessionDataTask or URLSessionDownloadTask for getting image我应该选择 URLSessionDataTask 还是 URLSessionDownloadTask 来获取图像
【发布时间】:2020-07-28 16:11:38
【问题描述】:

我使用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方法写的:

下载任务可以在以后继续传输数据。所有其他任务在恢复后必须重新开始。

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

【问题讨论】:

    标签: ios swift nsurlsessiondownloadtask nsurlsessiondatatask


    【解决方案1】:

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

    NSURLSessionDownloadTask : NSURLSessionDownloadTask 直接将响应数据写入临时文件。它支持在应用未运行时进行后台下载,并且在您的情况下允许继续下载。

    问题是您为什么要继续下载您尝试在 App 中显示的“图像”。它会改变吗?还是在整个应用程序中总是一样的。如果它在未来有机会改变,我认为你应该坚持URLSessionDataTask,因为imo它会消耗本地存储来一遍又一遍地下载和写入图像。

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

    【讨论】:

    • 感谢您的回复!用例是用户滑动并显示下一个图像,但用户可以返回上一个图像。用户也可以非常快速地滑动而不等待图像显示,但无论如何都会发送请求,所以为什么不保存直到现在下载的内容以备后用。您可能是对的,很多下载会堆积很多文件 - 这就是您的意思,对吗?也许我可以在某个地方设置一个限制,并且可以删除最旧的下载?
    • 你是对的,在那个。在这种情况下,您每次下载存储时都必须检查。可确保您在下载时不会收到diskfull 错误,并且您知道。的大小。你的形象。下载,你应该参考这个。错误处理 :) stackoverflow.com/questions/55304446/… 。让我知道你的想法
    • 好的 - 谢谢!所以我可以检查是否需要清理。我想知道我会清理什么。我的意思是当临时文件占用太多空间时,我可以找到临时文件的位置来清除它们吗?还是我现在唯一的选择就是停止保存部分下载?
    • 所以我想如果我只是在未完成的下载任务上调用取消,它将清除 resumeData...如果这是正确的,请更新您的答案以反映需要处理低磁盘空间情况并且可能使用您提供的链接,我会接受它。
    【解决方案2】:

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

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

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

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

    【讨论】:

      猜你喜欢
      • 2013-04-17
      • 1970-01-01
      • 2021-01-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-27
      • 1970-01-01
      相关资源
      最近更新 更多