gpt4 book ai didi

ios - NSURLConnection connectionDidFinishLoading 未被随机调用

转载 作者:行者123 更新时间:2023-11-29 11:01:19 25 4
gpt4 key购买 nike

我有一个 iPad 应用程序,我在其中使用 NSURLConnection 进行异步调用。在某些情况下,我在 connection:didReceiveData: 中收到所有响应数据,但从未调用过 connectionDidFinishLoading。没有错误。这有点随机,因为相同的响应在其他时间完成。

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

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

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

这是未完成的响应的示例 header 。它与完成的响应的 header 没有区别。

>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];

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

最佳答案

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

  1. 请求并发运行,因此如果您没有一些类来封装来自各个请求的所有响应数据等,您的应用可能会混淆来自不同请求的响应数据;

  2. 因为它们是同时发生的,而且 iOS 只允许对给定服务器发出五个并发请求,所以它会延迟(并可能超时)其他请求。

您有很多不同的方法,但您可能:

  • 您可能希望在后台队列中执行此网络操作;

  • 如果您想要并发操作(并且这样做有明显的性能优势),您可以使用 NSOperationQueue 进行并发操作,但限制正在进行的并发操作数(最多 4 个)或 5) 使用 maxConcurrentOperationCount。如果您在这些后台操作中使用同步网络操作,这个过程就很简单,但是如果您在后台队列中使用异步网络操作和您自己的委托(delegate)方法,这个过程就会非常复杂。

  • 如果您确实需要 (a) 使用您自己的委托(delegate)方法(例如更新进度 View 、流协议(protocol)等)来使用异步网络调用; (b) 您想享受并发操作,使用起来会容易得多 AFNetworking而不是自己编写。我经历了这个编写自己的练习,但完成了一次练习后,我现在更充分地理解了 AFNetworking 带来的好处。

当然,您可以通过管理您自己的待处理网络请求数组来解决所有这些问题,启动第一个请求,然后启动 connectionDidFinishLoading 和/或 didFailWithError关闭你队列中的下一个,但是你失去了并发的性能增益。但这是一种简单的解决方法。

关于ios - NSURLConnection connectionDidFinishLoading 未被随机调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15792459/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com