后台上传大量数据

时间:2017-07-10 11:55:22

标签: ios image-uploading nsurlsession nsurlsessionuploadtask

我需要从iOS设备上传大量照片到服务器。例如,500张照片。我该怎么办?

我为每张照片创建了带有NSURLSession的后台会话配置的上传任务。我尝试制作自己的自定义队列,其中每个下一个任务将在完成上一个任务后启动。但有一刻,新的任务还没有开始。我想,因为这一切都发生在后台。有关此问题的更多信息,请参阅here

(如果有一个队列的方法是正确的,请你建议很好地实现异步任务的队列,因为我可能在我的实现中弄乱了一些东西)

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

总结上述所有内容,这是在iOS中背景上传大片数据的正确方法(在我的情况下是500张照片)?

2 个答案:

答案 0 :(得分:2)

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

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

我怀疑最好的方法是:

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

需要注意的是,所有这一切都必须很快完成。您可能会发现有必要提前将文件预先合并到ZIP存档中以避免被杀死。但是不要试图将它们组合成一个文件,因为在重试时截断头部时你会花费太长时间。

如果你还没有撞到墙上,你很快就会出现。 : - )

答案 1 :(得分:0)

  

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

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

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

创建与每个上传过程相对应的NSoperation。在你的情况下,它可能是500左右。

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

它将逐一执行。

有关缓存和所有内容的详细信息,请按照SO POST

进行操作

以下是Swift Version