Я пишу клиент для iPhone, который загружает вещи из сети. Поскольку сотовая сеть не такая быстрая, а файлы могут быть большими, я хотел улучшить счетчик активности с помощью индикатора выполнения.
Пока все хорошо, я использую NSURLConnection и проверяю заголовок Content-Length
, чтобы увидеть, сколько байтов я скачаю. Затем в обратном вызове -connection:didReceiveData:
я добавляю полученные данные к моему NSMutableData
объекту, и там я могу отследить размер загруженного контента до ожидаемых байтов.
Это все работает, пока у вас не будет сервера, который поддерживает сжатие GZIP. Сервер, использующий сжатие gzip, будет объявлять x байтов в качестве размера контента. Однако, поскольку NSURLConnection выполняет декомпрессию за кулисами, данные, переданные обратному вызову didReceiveData
, уже расширены. Следовательно, ожидаемые загруженные байты меньше, чем фактически полученные байты, в пропорции степени сжатия для файла.
Это означает, что индикатор выполнения переполняется , поскольку ожидаемое количество байтов достигается намного раньше, чем ожидалось. Что-то, что я мог сделать, когда я управляю сервером, это отправить специальные заголовки для содержимого gzip, чтобы избежать распаковки, выполняемой NSURLConnection, но я не могу контролировать все серверы в сети.
Существует ли какой-либо скрытый метод для NSURLConnection, чтобы сообщать о переданных байтах, а не расширенных байтах? Должен ли я кодировать свое собственное NSURLConnection, чтобы отслеживать переданные байты и самостоятельно распаковывать данные gzip для точного индикатора выполнения? Может быть, есть альтернативный базовый API нижнего уровня?