Ios NSURLConnection:DidReceiverResponse:在didFailWithError之外调用:

Ios NSURLConnection:DidReceiverResponse:在didFailWithError之外调用:,ios,nsurlconnection,Ios,Nsurlconnection,我注意到,如果存在连接问题,那么除了didFailWithError:(使用HTTP 400)之外,还会调用didReceiveResponse: 这不是我所期望的,并且使处理错误情况变得棘手——特别是因为我还注意到didReceiveResponse:是在didFailWithError:之前调用的东西,有时在它之后调用的东西 我不敢相信这是故意的行为,因此我想知道我的代码是否有问题,但如果有,我无法想象如何 有人能确认NSURLConnection的行为应该是什么,或者他们以前是否见过类似的

我注意到,如果存在连接问题,那么除了didFailWithError:(使用HTTP 400)之外,还会调用didReceiveResponse:

这不是我所期望的,并且使处理错误情况变得棘手——特别是因为我还注意到didReceiveResponse:是在didFailWithError:之前调用的东西,有时在它之后调用的东西

我不敢相信这是故意的行为,因此我想知道我的代码是否有问题,但如果有,我无法想象如何


有人能确认NSURLConnection的行为应该是什么,或者他们以前是否见过类似的行为吗?

非常确定这是按照预期工作的。
-connectiondFinishLoading:
连接:didFailWithError:
方法是互斥的,但是可以通过调用一个(或多个!)连接:didReceiverResponse:来处理其中一个方法

毕竟,在这种情况下,您确实收到了一个有效的HTTP响应。它恰好表明您的请求由于该请求的某些问题而无法处理。(例如,与超时相反,加载失败,但从未有响应。)


但是,
-connectiondFinishLoading:
connection:didfailwither:
中的一条应该始终是给定连接的最后一条消息。(如果您对多个连接使用单个委托,请确保在看到这些调用出现故障时,您正在查看同一个连接对象。)

16是正确的。通常您只需清空didReceiveResponse中的数据缓冲区。如果在didFailWithError:之前调用了didReceiveResponse:,则在上述情况下,是否有一种方法可以确定didReceiveResponse中的HTTP状态代码是什么,以便其中的处理可以根据需要进行调整?当然:第二个参数是一个
NSHTTPURLResponse
(假设是HTTP请求),它包含状态代码、标头等。唯一棘手的是,您只能在那里将其传递给您,而不是在finish或failure方法中,因此如果您也需要它,您可能需要将其(或其包含的信息)存储在某种数据结构中。