【问题标题】:NSURLSessionDownloadTask cancelByProducingResumeData vs suspendNSURLSessionDownloadTask cancelByProducingResumeData vs 挂起
【发布时间】:2016-05-13 04:34:28
【问题描述】:

我需要暂停下载任务并在应用重新启动后恢复。但我不确定我应该使用哪种方法,suspendcancelByProducingResumeData

使用cancelByProducingResumeData,我可以获取部分下载的数据并使用它重新创建下载任务。但是我必须手动管理数据,将其保存到文件,读回并重新创建任务并确保新任务不会失败。

使用suspend,我可以暂停和恢复下载任务。但是我可以在应用程序重新启动后恢复这个任务吗?我正在使用后台会话,因此任务会在重启后保留。

cancelByProducingResumeDatarequirements 才能工作,这些要求是否也适用于suspend/resume?或者suspend/resume只是文档所说的“临时暂停任务”的意思?

【问题讨论】:

  • 根据我的阅读,cancelByProducingResumeData 是您唯一的选择。

标签: ios swift nsurlsession


【解决方案1】:

你想多了这个问题。下载任务的“恢复数据”不是该任务在此之前收到的数据。它是一个很小的簿记数据——你通常会在NSUserDefaults 中放入数组中的那种东西。

话虽如此,要回答原始问题,任务仅在会话的上下文中有效。因此,对于前台会话,一旦您的应用退出,该会话将不复存在,因此无法再访问该会话中的任务。因此,重新启动应用程序后无法恢复暂停的任务,因为该任务不再存在(因为它的会话不再存在)。

对于后台会话,您几乎必须询问 Foundation Networking 团队中的某个人以获得该问题的答案,因为这取决于事后您可以在多大程度上重新创建会话。但是,我的猜测是它可能也不会在那里工作,如果可以,你应该认为它不受支持。

【讨论】:

  • 您是否声称“恢复数据”在应用启动之间不可用?这在某处有记录吗?
  • 不,一点也不。到那时,任务接收到的数据由下载任务静默存储在磁盘上的文件中。简历数据只是告诉新任务在哪里可以找到它。这就是为什么它是这么小的数据。
  • 好吧,我被读得太快弄糊涂了——“重新启动应用程序后无法恢复暂停的任务”你的意思是suspend()ed,不是cancelByProducingResumeData,我相信它确实满足了 OP 的需求。
  • 正确。取消任务不会暂停它。它取消它。 :-)
  • 我一直认为简历数据是部分下载的数据+元数据,但我刚刚检查它看起来像是用XML格式序列化的任务。感谢您提供的信息。
【解决方案2】:

对苹果开发者表单进行了一番研究,发现this

任务挂起很少使用,当使用时,它主要用于临时禁用回调,作为某种并发控制系统的一部分。那是因为挂起的任务仍然可以在线上处于活动状态。暂停所做的只是阻止它在内部取得进展、发出回调等等。

OTOH,如果您要实现长期暂停(例如,用户想要暂停下载),您最好调用 -cancelByProducingResumeData:。

所以suspend 可能实际上不会停止下载,我应该使用cancelByProducingResumeData: 进行长期暂停。

【讨论】:

  • 严格来说并非如此。在某些时候,TCP 套接字的接收缓冲区应该填满,因为没有人从中读取,此时远程主机应该停止发送数据。话虽如此,除非您使用它来暂停批量传输,否则它可能不会给您带来太多好处,以便您可以做一些对时间要求更高的事情。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-11-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-06
  • 1970-01-01
相关资源
最近更新 更多