如果Web服务调用之间的连接断开,如何处理应用程序

时间:2017-01-09 07:39:23

标签: objective-c nsurlconnection nsurlsession reachability nsurlsessiondatatask

在几次采访中,我被问到处理连接,Web服务调用,服务器响应等等。即使是现在我也不清楚很多事情。请你帮助我更好地了解以下情况?

  1. 使用NSURLSessionDataTask代替NSURLConnection有什么好处 - 我有一个想法,即使NSURLSessionDataTask的连接断开,但不会发生数据丢失后者。但它是如何工作的?

  2. 如果在将请求发送到服务器或连接到服务器后连接中断,我们如何在NSURLConnectionNSURLSessionDataTask处理我们的代码? - 我的想法是使用Reachability类并检查它何时上线。

  3. 我们发送的数据已在服务器端更新。但是我们没有得到服务器的响应。我们可以做些什么来处理这种情况? - 增加timeOutInterval是我们唯一可以做的事情吗?

  4. 请帮我解决这些问题。非常感谢你提前!!

1 个答案:

答案 0 :(得分:2)

这确实存在多个问题,但我会尽量简单地回答这些问题。

  1. var a1 = new ActionBlock<int>( i => doSomeWork(i), new ExecutionDataflowBlockOptions {BoundedCapacity = 1} ); NSURLConnection之间的大多数失败处理方式相同。后者的主要优点是支持后台下载和取消相关请求组。

    也就是说,如果您正在进行大量下载,您认为可能会失败,NSURLSession会提供下载任务,让您在网络连接失败时恢复下载,类似于NSURLSession使用的NSURLDownload在OS X上做(从未在iOS上使用)。这仅对下载大文件有帮助,不适用于大型上传(需要大量服务器端支持才能恢复)或其他请求。

  2. 你的直觉是正确的。当连接失败时,创建一个可访问性对象,监视该特定主机名,以查看何时再次尝试请求的好时机。然后,再次尝试请求。

    您可能还会显示某种咨询用户界面,表示您没有互联网连接。 (通过咨询,我指的是用户不必点击的东西,并且不会影响应用程序的离线使用;请查看Facebook应用程序以获得一个很好的示例。)

  3. 在发出请求时提供唯一标识符,并将其与服务器的响应一起存储在服务器上,直到客户端确认收到响应(或在一段合理的天数后仍然清除它)。上传完成后,如果可以的话,服务器会给你回复。

    如果出现问题,客户端会要求服务器重新发送与该唯一标识符关联的响应。一旦您的客户端拥有数据,它就会确认收到并且服务器会删除响应。如果您向服务器询问响应但没有响应,那么上传并没有真正完成。

    通过一些额外的工作,这种方法可以更可靠地支持长时间运行的上传。如果上传失败,请询问服务器为该标识符获取了多少数据,然后告诉服务器您将从下一个字节开始上传新数据。在服务器端,从该字节开始覆盖旧数据(以防万一您在询问长度时仍在写入某些数据)。

  4. 希望有所帮助。