connectionDidFinishLoading

connectionDidFinishLoading

我有一个iPad应用程序,正在使用NSURLConnection进行异步调用。在某些情况下,我以 connection:didReceiveData:接收所有响应数据,但是 connectionDidFinishLoading从未被称为。没有错误。这在某种程度上是随机的,因为相同的响应会在其他时间完成。

我的 class 的工作方式是使用以下命令连续发送大约20个请求:

NSURLConnection *connection = [[NSURLConnection alloc] initWithRequest:request delegate:self startImmediately:YES];

然后我只等他们回来。这是创建多个请求的有效方法吗?

这是未完成的响应的示例标头。它与完成的响应的标头没有区别。
>Keep-Alive: timeout=5, max=100
>Transfer-Encoding: Identity
>Server: Apache/2.2.9 (Unix) mod_ssl/2.2.9 OpenSSL/0.9.8b mod_jk/1.2.26
>Content-Type: application/json;charset=UTF-8
>Connection: Keep-Alive
>Date: Wed, 03 Apr 2013 05:25:32 GMT
>Cache-Control: private, no-transform, max-age=600

该问题的一种怪异症状是,我开始使用以下方法检查预期的内容长度:
long long download_size =[response expectedContentLength];

永远不会在http标头中设置Content-Length。当请求失败时,download_size为-1(预期),当同一请求未失败时,download_size设置为某个数字。但是,在许多情况下,未设置download_size且响应不会失败。

最佳答案

这不是发起20个请求的好方法,因为:

  • 这些请求是并发运行的,因此,如果您没有封装来自单个请求的所有响应数据之类的类,则您的应用程序可能会混淆来自各种请求的响应数据。
  • 因为它们是同时发生的,并且因为iOS仅允许对给定服务器的五个并发请求,所以它将延迟(可能超时)其他请求。

  • 您有很多不同的方法,但是您可能:
  • 您可能想在后台队列中执行此网络工作;
  • 如果您要进行并发操作(这样做有明显的性能优势),则可以使用NSOperationQueue进行并发操作,但可以使用maxConcurrentOperationCount限制正在进行的并发操作数(至4或5)。如果在这些后台操作中使用同步网络操作,则此过程很简单,但是如果在后台队列中将异步网络操作与自己的委托方法一起使用,则会令人惊讶地复杂。
  • 如果您确实需要(a)使用您自己的委托方法(例如,更新进度视图,流协议等)使用异步网络调用; (b)您想享受并发操作,使用 AFNetworking 比编写自己的脚本要容易得多。我完成了自己编写的练习,但是完成了一次练习之后,现在我更加全面地了解AFNetworking给表带来的好处。

  • 当然,您可以通过管理自己的未决网络请求数组,启动第一个请求,并让connectionDidFinishLoading和/或didFailWithError从队列中的下一个开始,来解决所有这些问题,但是会损失并发性能。但这是一种简单的解决方法。

    09-08 05:22