在几次采访中,我被问到处理连接,Web服务调用,服务器响应等等。即使是现在我也不清楚很多事情。请你帮助我更好地了解以下情况?
使用NSURLSessionDataTask
代替NSURLConnection
有什么好处 - 我有一个想法,即使NSURLSessionDataTask
的连接断开,但不会发生数据丢失后者。但它是如何工作的?
如果在将请求发送到服务器或连接到服务器后连接中断,我们如何在NSURLConnection
和NSURLSessionDataTask
处理我们的代码? - 我的想法是使用Reachability类并检查它何时上线。
我们发送的数据已在服务器端更新。但是我们没有得到服务器的响应。我们可以做些什么来处理这种情况? - 增加timeOutInterval是我们唯一可以做的事情吗?
请帮我解决这些问题。非常感谢你提前!!
答案 0 :(得分:2)
这确实存在多个问题,但我会尽量简单地回答这些问题。
var a1 = new ActionBlock<int>(
i => doSomeWork(i),
new ExecutionDataflowBlockOptions {BoundedCapacity = 1}
);
和NSURLConnection
之间的大多数失败处理方式相同。后者的主要优点是支持后台下载和取消相关请求组。
也就是说,如果您正在进行大量下载,您认为可能会失败,NSURLSession
会提供下载任务,让您在网络连接失败时恢复下载,类似于NSURLSession
使用的NSURLDownload
在OS X上做(从未在iOS上使用)。这仅对下载大文件有帮助,不适用于大型上传(需要大量服务器端支持才能恢复)或其他请求。
你的直觉是正确的。当连接失败时,创建一个可访问性对象,监视该特定主机名,以查看何时再次尝试请求的好时机。然后,再次尝试请求。
您可能还会显示某种咨询用户界面,表示您没有互联网连接。 (通过咨询,我指的是用户不必点击的东西,并且不会影响应用程序的离线使用;请查看Facebook应用程序以获得一个很好的示例。)
在发出请求时提供唯一标识符,并将其与服务器的响应一起存储在服务器上,直到客户端确认收到响应(或在一段合理的天数后仍然清除它)。上传完成后,如果可以的话,服务器会给你回复。
如果出现问题,客户端会要求服务器重新发送与该唯一标识符关联的响应。一旦您的客户端拥有数据,它就会确认收到并且服务器会删除响应。如果您向服务器询问响应但没有响应,那么上传并没有真正完成。
通过一些额外的工作,这种方法可以更可靠地支持长时间运行的上传。如果上传失败,请询问服务器为该标识符获取了多少数据,然后告诉服务器您将从下一个字节开始上传新数据。在服务器端,从该字节开始覆盖旧数据(以防万一您在询问长度时仍在写入某些数据)。
希望有所帮助。