2012-08-22 54 views
1

我注意到,如果存在連接問題,那麼didReceiveResponse:除didFailWithError之外還會被調用:(使用HTTP 400)。NSURLConnection:didReceiveResponse:除didFailWithError外調用:

這不是我所期望的,並且使得處理錯誤情況非常棘手 - 特別是因爲我也注意到didReceiveResponse:在didFailWithError之前被調用:有時在之後。

我不能相信這是有意的行爲,因此我想知道是否有一些問題與我的代碼,但如果有我無法想象如何。

任何人都可以確認NSURLConnection的行爲應該在哪裏,或者他們以前是否看過類似的行爲?

回答

3

很確定這是按預期工作的。 -connectionDidFinishLoading:connection:didFailWithError:方法是相互排斥的,但任一方法都可以通過呼叫(或許多!)到connection:didReceiveResponse:來進行。

畢竟,你在這種情況下確實收到一個有效的HTTP響應。它恰好是一個表明您的請求無法處理的原因是該請求存在某些問題。 (相對於,比如說超時,當加載失敗,但從來就沒有迴應。)

然而,-connectionDidFinishLoading:一個或connection:didFailWithError:應該總是最後消息,你會得到一個給定的連接。 (如果您爲多個連接使用單個代理,請確保在看到這些調用失敗時查看相同的連接對象。)

+1

十六是正確的。通常你只需在didReceiveResponse中清空數據緩衝區。 – EricS

+0

如果在didFailWithError之前調用了didReceiveResponse:在上面的這種情況下,有沒有一種方法可以在didReceiveResponse中確定HTTP狀態代碼是什麼,以便那裏的處理可以根據需要進行調整? – Gruntcakes

+0

當然:第二個參數是一個'NSHTTPURLResponse'(假設有一個HTTP請求),它有狀態碼,標題等等。唯一棘手的是你只將它傳遞給你,而不是在完成或失敗方法中,所以你可能需要在某種數據結構中存儲它(或它包含的信息),如果你需要的話它也在那裏。 –

相關問題