Я не уверен насчет реализации -dataWithContentsOfURL: но использование такого синхронного метода в любом случае не рекомендуется.
Что-то, основанное на NSURLConnection, - ваш лучший выбор, но вы должны знать о нескольких вещах. Большинство людей не понимают, что, если сервер отключается, когда NSURLConnection получает данные, это не приведет к ошибке загрузки с ошибкой. Метод делегата -connectionDidFinishLoading:
будет вызываться как обычно. Многие люди ошибаются.
Если вы хотите убедиться, что у вас есть все данные, вам нужно обработать метод делегата -connection:didReceiveResponse:
и сохранить значение [response expectedContentLength]
. Затем в -connectionDidFinishLoading:
вы можете убедиться, что вы получили то же число байтов, что и ожидалось, и, если нет, сгенерировать ошибку.
Существует множество бесплатных библиотек, основанных на NSURLConnection
, таких как AFNetworking . Однако вам нужно остерегаться плохого кода. Я только что проверил источник на AFNetworking
, и, похоже, они также не проверяют случай, когда сервер отправляет обратно меньше данных, чем указано в заголовке Content-Length
. Также обратите внимание, что популярный ASIHTTPRequest больше не разрабатывается активно и подвергся некоторой критике по поводу его реализации.
Я предоставлю другим возможность предложить другие альтернативные библиотеки, но NSURLConnection
- верное направление.