我有一个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个请求的好方法,因为:
您有很多不同的方法,但是您可能:
NSOperationQueue
进行并发操作,但可以使用maxConcurrentOperationCount
限制正在进行的并发操作数(至4或5)。如果在这些后台操作中使用同步网络操作,则此过程很简单,但是如果在后台队列中将异步网络操作与自己的委托方法一起使用,则会令人惊讶地复杂。 AFNetworking
比编写自己的脚本要容易得多。我完成了自己编写的练习,但是完成了一次练习之后,现在我更加全面地了解AFNetworking
给表带来的好处。 当然,您可以通过管理自己的未决网络请求数组,启动第一个请求,并让
connectionDidFinishLoading
和/或didFailWithError
从队列中的下一个开始,来解决所有这些问题,但是会损失并发性能。但这是一种简单的解决方法。