大数据后台上传

Background upload of large amount of data

我需要将大量照片从我的 iOS 设备上传到服务器。例如,500 张照片。我应该怎么做才对?

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

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

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

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

For downloading this much amount of images you may need to ask the user not to stop the application or putting in background mode.

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

如果用户phone处于活跃状态,

创建一个NSoperation对应每个上传进程。你的情况可能是 500 左右。

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

会一一执行。

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

这是Swift Version

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

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

我怀疑最好的方法是:

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

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

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