我需要将大量照片从我的 iOS 设备上传到服务器。例如,500 张照片。我应该怎么做才对?
我为每张照片创建了带有 NSURLSession 后台 session 配置的上传任务。我尝试制作自己的自定义队列,其中每个下一个任务都会在前一个任务完成后启动。但是有一段时间没有开始新的任务。我猜,因为这一切都发生在幕后。有关此问题的更多信息,您可以阅读 here
(如果使用队列的方法是正确的,请您建议异步任务队列的良好实现,因为我可能在我的实现中搞砸了一些东西)
所以在上面链接的文章之后,我的猜测是我应该立即开始所有上传任务(而不是一个接一个)。但我有效率问题。如果我为每张照片创建一个任务,它将有 500 个后台异步任务和大约 1 GB 的并行数据上传。我想,这会导致网络出现一些问题。
综上所述,在 iOS 中后台上传大量数据(我的例子是 500 张照片)哪种方式才是正确的?
Best Answer-推荐答案 strong>
不幸的是,由于糟糕的设计决策,Apple 的 API 在这项任务中表现糟糕。您面临几个主要障碍:
- 您可以同时创建的任务数量是有限制的。我认为性能在大约 100 个任务的某个位置开始下降。
- 操作系统唤醒您的应用的频率是有限制的。它唤醒您的应用的频率越高,再次唤醒之前等待的时间就越长。在某些时候,这将导致无法安排新任务。
- 如果发生故障,上传不会从中断的地方继续;他们重新启动。这可能会导致在糟糕的网络上产生巨大的带宽成本。
我怀疑最好的方法是:
- 将请求分成几个大组,每个组都可以写入一个 ZIP 存档,该存档既不会大到用户用完磁盘空间,也不会小到上传速度过快。
- 将第一组这些文件写入单个文件(例如,以 ZIP 格式)。
- 在服务器端使用自定义脚本,让您可以通过添加额外的 CGI 参数从中断的地方继续上传。
- 失败时,询问服务器它得到了多少数据,然后截断文件的前面并从当前位置重新上传。
- 成功后,计算第一个大文件完成上传的速度,如果不是 O(分钟),则合并接下来的几组。将集合写入文件,并开始下一个请求。
需要注意的是,所有这些都必须相当快地完成。您可能会发现有必要提前将文件预先组合到 ZIP 存档中,以免被杀死。但是不要试图将它们合并到一个文件中,因为这样在重试时截断头部会花费太长时间。 (从表面上看,您还可以提供任何参数作为 URL 的一部分,并使 POST 正文成为原始数据,并提供一个文件流以从偏移量开始的 ZIP 存档中读取。)
如果您还没有用头撞墙,那么您很快就会。 :-)
关于ios - 大数据后台上传,我们在Stack Overflow上找到一个类似的问题:
https://stackoverflow.com/questions/45011360/
|