iOS - Возможно ли, что [NSData dataWithContentsOfURL: url] вернет только часть байтов содержимого? - PullRequest
3 голосов
/ 21 марта 2012

Будет ли [NSData dataWithContentsOfURL:url] либо возвращать полное количество байтов в случае успеха, либо nil, если что-то пойдет не так?

Есть ли вероятность, что он вернет, может быть, только половину байтов содержимого... возможно, если их интернет-соединение не будет установлено на полпути?

Если есть вероятность, что он вернет только частичные данные, есть ли какая-то другая функция, которую я мог бы использовать, которая была бы более надежной, и я смог быточно знать, получили ли они полный объем данных или нет?

Ответы [ 2 ]

6 голосов
/ 21 марта 2012

Я не уверен насчет реализации -dataWithContentsOfURL: но использование такого синхронного метода в любом случае не рекомендуется.

Что-то, основанное на NSURLConnection, - ваш лучший выбор, но вы должны знать о нескольких вещах. Большинство людей не понимают, что, если сервер отключается, когда NSURLConnection получает данные, это не приведет к ошибке загрузки с ошибкой. Метод делегата -connectionDidFinishLoading: будет вызываться как обычно. Многие люди ошибаются.

Если вы хотите убедиться, что у вас есть все данные, вам нужно обработать метод делегата -connection:didReceiveResponse: и сохранить значение [response expectedContentLength]. Затем в -connectionDidFinishLoading: вы можете убедиться, что вы получили то же число байтов, что и ожидалось, и, если нет, сгенерировать ошибку.

Существует множество бесплатных библиотек, основанных на NSURLConnection, таких как AFNetworking . Однако вам нужно остерегаться плохого кода. Я только что проверил источник на AFNetworking, и, похоже, они также не проверяют случай, когда сервер отправляет обратно меньше данных, чем указано в заголовке Content-Length. Также обратите внимание, что популярный ASIHTTPRequest больше не разрабатывается активно и подвергся некоторой критике по поводу его реализации.

Я предоставлю другим возможность предложить другие альтернативные библиотеки, но NSURLConnection - верное направление.

1 голос
/ 21 марта 2012

Если вы «беспокоитесь» о такой вещи, я бы рекомендовал использовать NSURLConnection с соответствующими делегатами.

Асинхронный подход (то есть NSURLConnection) всегда лучше, чем он.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...