13

我目前正在设计一个系统,用于将多个图像从应用程序上传到服务器。文件将存储在本地设备上,目前的想法是将它们分成块,然后逐块上传到服务器,等待成功消息返回,然后再上传下一个。

这个过程对用户来说应该是无缝的,他们应该按下一个按钮来提交所有图像,然后能够关闭应用程序并让它在后台继续。在 iOS 7 中,我看到您可以将上传的内容传递给新的 NSURLSession API,并让它处理独立于您的应用程序的上传任务。

我想知道是否有人知道这种转移有多可靠。如果我将整个图像传递给它,如果互联网连接中途中断会发生什么?后台传输服务是否稍后重试?我们的想法是我们可以上传一张图片,如果它在中途失败,我们可以在稍后恢复连接时从该点继续。

我们的一个想法是将文件分成块,然后将所有块作为单独的 NSURLSessionUploadTasks 传递,并假设它们最终都会被发送到服务器。

另一个是使用以下方法发送第一个块:

uploadTaskWithRequest:fromData:completionHandler:

然后在completionHandler中再发送下一个chunk。我的问题是,如果在后台下一个块将有它的

@property BOOL discretionary = true

这意味着它只会在插入时通过 WiFi 发送。我需要它在所有网络上工作并能够应对中断。

我不想要任何代码,只是建议这是否是实现这一目标的正确方法。

4

1 回答 1

7

我会试着回答你的一些问题

如果您的上传由于错误而中途停止,您的应用程序应该在后台启动,并且您应该能够执行所需的错误处理。在您的情况下,如果您的服务器支持可恢复上传,您应该能够获取偏移量,然后设置另一个任务来上传下一个块。

如果您使用配置为在后台运行的 NSURLSession,则您无法使用完成处理程序设置上传任务,并且您无法使用 NSData 对象上传您的块。您唯一的选择是将块写入磁盘然后使用

uploadTaskWithRequest:fromFile:

我认为这是有道理的,因为 NSData 对象驻留在应用程序内存中,并且后台上传由外部守护程序执行,因此只有上传文件(从用户的沙箱)才是正确的。此外,您需要使用委托来监听回调,而不是使用完成处理程序(当应用程序在前台时)。

如果您仍然喜欢使用 NSData 对象,那么另一种解决方案是使用

downloadTaskWithRequest:

这样,您可以在请求正文中设置 NSData 对象并在请求中传递它。您需要使用 NSURLMutableRequest 设置您的请求来实现这一点。

对于可自由支配的财产,由于它默认为 TRUE,我不确定我们是否可以为此做很多事情。它说传输更有可能发生在 Wi-Fi 上,并且当插入时,它可能会发生在蜂窝网络上的可能性很小,但不要相信我的话,我只是在猜测。

于 2013-10-01T17:47:38.680 回答