1

Это может быть очень глупый вопрос! Но, как я сомневаюсь, подумал о том, чтобы спросить здесь.NSURLConnection: Confusion with oder, в котором: didReceiveResponse: и connection: didFailWithError: называются

  1. ли два метода делегата (т.е. connection:didReceiveResponse: и connection:didFailWithError:) являются взаимно исключающими друг друга? Я имею в виду, есть ли какой-либо сценарий, в котором оба метода делегата могут быть вызваны объектом NSURLConnection?

  2. В случае, если вызван только connection:didFailWithError:, как получить код состояния HTTP?

ответ

2

Из документов:

The only case where this message is not sent to the delegate is when the protocol implementation encounters an error before a response could be created.

NSURLConnectionDelegate Class Reference

Таким образом, NSURLConnection мог не прежде, чем он получает ответ, однако он может не после. Поскольку соединение: didFailWithError прекращает дальнейшие сообщения для этой связи следующие два сценария может произойти:

  1. запускается соединение, не удается получить ответ и связь: didFailWithError называется.
  2. Соединение запускается и получает ответ, соединение: didReceiveResponse: вызывается, по какой-либо причине соединение по какой-либо причине (например, сетевое подключение может выпадать), до вызова connectionDidFinishLoading.

Вам нужно будет получить код статуса HTTP из соединения: didReceiveResponse, если этот метод не вызывается, код статуса отсутствует, так как он является частью ответа. Если вам нужно получить доступ к нему из-под подключения: didFailWithError, вам нужно будет записать его.

Обратите внимание, что, чтобы получить код статуса, вы должны будете также случаю NSURLResponse к NSHTTPURLResponse так:

NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse *) response; 
NSLog(@"Status code %ld", httpResponse.statusCode); 
+0

Таким образом, когда соединение: didReceiveResponse: называется, она может либо закончиться в связи: didFinishLoading: или соединение: didFailWithError:? –

+0

Если это удастся, оно вызовет didReceiveData: где вам нужно записать данные (самый простой способ - использовать appendData на объекте NSMutableData) перед вызовом didFinishLoading: если он успешный. Если он не работает, он может по-прежнему вызывать didReceiveData перед сбоем (поскольку соединение может потерпеть неудачу в любой точке). Но да, соединение должно либо в конечном итоге вызвать соединение: didFinishLoading или connection: didFailWithError: –

+0

Извините за поздний ответ !! Как фиксировать сетевые ошибки, такие как 400, 404, 500 и т. Д. Получают ли они уведомление в связи: didReceiveResponse: или connection: didFailWithError:? –

 Смежные вопросы

  • Нет связанных вопросов^_^