Цель-C: NSURLConnection, когда начинать работать с ответом? - PullRequest
1 голос
/ 03 мая 2011

При использовании NSURLConnection есть несколько способов наблюдения ... Я понимаю, что connection:didReceiveResponse: может потенциально запускаться несколько раз во время соединения.

В какой момент безопасно начать работу сполучил информацию?В пределах connectionDidFinishLoading:?

В моем проекте я добавляю полученные данные в connection:didReceiveData:, устанавливая: // append the data [receivedData appendData:data];

Затем я фактически работаю с результатами в пределах connectionDidFinishLoading: ... создание моего NSDictionary с TouchJSON, циклический просмотр данных и изменение моего пользовательского интерфейса.

Правильно ли я делаю это?

Ответы [ 2 ]

3 голосов
/ 03 мая 2011

connectionDidFinishLoading - правильное место для начала работы с полученными данными.

didReceiveData - правильное место для добавления вновь полученных данных (не didReceiveResponse).

didReceiveResponse - хорошее место для проверки кодов состояния HTTP и т. Д.

1 голос
/ 03 мая 2011

Вам действительно требуется асинхронное соединение для задачи, которую вы выполняете?Если все, что вы делаете в connection:didReceiveResponse:, добавляет данные в буфер, то вы действительно ничего не получаете, используя асинхронный запрос.

Почему бы просто не отсоединить поток, который использует sendSynchronousRequest:returningResponse:error:?Тогда ваш поток может вызвать обратный вызов, когда у него есть данные (или когда он допустил ошибку), и нет необходимости беспокоиться о том, когда безопасно начинать работу с ответом.

Если, с другой стороны,у вас был потоковый JSON-анализатор, который мог бы анализировать данные во время загрузки, поэтому имеет смысл использовать асинхронный запрос и передавать данные в анализатор по мере их поступления.Это потребует меньше памяти, так как вам не нужно будет буферизовать весь ответ, и будет казаться быстрее во время выполнения, потому что часть анализа выполняется во время загрузки данных.В таком случае вы должны использовать connection:didReceiveResponse: для передачи данных в ваш анализатор вместо добавления их в буфер, а затем connectionDidFinishLoading:, чтобы сообщить вашему анализатору, что для анализа больше нет данных.

...