【问题标题】:Background upload of large amount of data后台上传大量数据
【发布时间】:2017-07-10 11:55:22
【问题描述】:

我需要将大量照片从我的 iOS 设备上传到服务器。例如,500 张照片。我应该如何正确地做到这一点?

我使用 NSURLSession 为每张照片创建了带有后台会话配置的上传任务。我尝试制作自己的自定义队列,其中每个下一个任务将在前一个任务完成后启动。但在某一时刻,新的任务并没有开始。我猜,因为这一切都发生在后台。更多关于这个问题,你可以阅读here

(如果使用队列的方法是正确的,请您建议一个好的异步任务队列实现,因为我可能在我的实现中搞砸了一些东西)

所以在上面链接的文章之后,我的猜测是我应该立即开始所有上传任务(而不是一个接一个)。但我有效率问题。如果我为每张照片创建一个任务,它将有 500 个后台异步任务和大约 1 GB 的数据并行上传。我想,这会导致网络出现问题。

综上所述,在iOS后台上传大量数据(我的情况下是500张照片)的正确方法是什么?

【问题讨论】:

    标签: ios image-uploading nsurlsession nsurlsessionuploadtask


    【解决方案1】:

    不幸的是,由于糟糕的设计决策,Apple 的 API 在这项任务上表现不佳。您面临几个主要障碍:

    • 您可以同时创建的任务数量是有限制的。我认为性能在大约 100 个任务时开始下降。
    • 操作系统唤醒您的应用程序的频率是有限制的。它唤醒您的应用程序的频率越高,它在再次唤醒它之前等待的时间就越长。在某些时候,这将导致无法安排新任务。
    • 如果发生故障,上传不会从中断处继续;他们重新启动。这可能会在糟糕的网络上导致巨大的带宽成本。

    我怀疑最好的方法是:

    • 将请求分成几个大组,每个组都可以写入单个 ZIP 存档,该存档不会太大而导致用户磁盘空间不足,但也不会太小以至于上传太快。
    • 将这些文件的第一组写入单个文件(例如 ZIP 格式)。
    • 在服务器端使用自定义脚本,通过添加额外的 CGI 参数,您可以从中断处继续上传。
    • 失败时,询问服务器它获取了多少数据,然后截断文件的前面并从当前位置重新上传。
    • 成功后,计算第一个大文件完成上传的速度,如果不是 O(分钟),则合并接下来的几组。将集合写入文件,然后开始下一个请求。

    需要注意的是,所有这些都必须相当快地完成。您可能会发现有必要提前将文件预先组合到 ZIP 存档中以避免被杀死。但是不要试图将它们合并到一个文件中,因为这样在重试时截断头部会花费很长时间。 (从表面上看,您还可以提供任何参数作为 URL 的一部分,并使 POST 正文成为原始数据,并提供一个文件流以从 ZIP 存档中从偏移量开始读取。)

    如果您还没有将头撞到墙上,那么您很快就会撞到。 :-)

    【讨论】:

      【解决方案2】:

      要下载这么多图像,您可能需要询问 用户不要停止应用程序或进入后台模式。

      因为在这两种情况下,我们将无法完成这么大的任务。

      如果用户手机处于激活状态,

      为每个上传过程创建一个NSoperation。在您的情况下,它可能在 500 左右。

      然后将NSOperations 添加到名为NSOperationQueue 的队列中,然后启动NSOperationQueue 任务。

      它会一一执行。

      有关缓存等更多详细信息,请关注SO POST

      这里是Swift Version

      【讨论】:

      • 上传这么多数据显然需要时间。要求用户保持应用打开听起来像是糟糕的用户体验。真的没有办法将该上传移至后台吗? Google Photos、Dropbox 和类似这样的服务以某种方式做到了这一点
      • 请查看此答案stackoverflow.com/a/41379720/5215474 .. 除非音乐播放器等特殊情况,否则任何应用程序都无法在后台运行
      • 您的答案不正确。我并没有首先询问应用程序终止。并且 App Store 中有应用程序在后台(即保管箱)中上传大量照片,所以我的任务是可能的。
      • 请阅读有关后台任务的苹果文档并阅读帖子stackoverflow.com/a/28283577/5215474
      • I do not have to consider NSURLSession for uploading a small amount of data. And besides, it's uploading task, it can take as much time as it wants. 这是您链接的帖子的引用。我将这个后台配置用于 NSURLSession 进行后台上传。你可以阅读它here
      猜你喜欢
      • 2017-02-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-12-26
      • 2015-11-30
      • 2020-03-16
      相关资源
      最近更新 更多