прогресс при загрузке файла с iPhone - PullRequest
2 голосов
/ 03 апреля 2010

Я загружаю файл с iPhone на сервер с HTTP POST и наблюдаю за ходом соединения NSURLConnection: didSendBodyData: totalBytesWritten: totalBytesExpectedToWrite. Проблема в том, что прогресс не гладкий. Начало файла проходит очень быстро в четырех фрагментах по 32 КБ, затем прогресс замедляется с меньшими фрагментами, пока не будет достигнут общий результат. Затем didSendBodyData больше не вызывается в течение некоторого времени, прежде чем ответ наконец возвращается. Таким образом, индикатор выполнения, управляемый кодом, идет быстро (почти мгновенно) в течение первых 128 КБ, затем медленно, а затем «залипает» на 100% в течение длительного времени.

Некоторые исследования предполагают, что первые четыре блока мгновенно попадают в «буфер ядра» телефона, и с этого момента данные поступают в буфер по мере того, как данные стекают с другого конца. Прогресс достигает 100%, когда поступают последние данные, но затем задерживается, пока буфер очищается на обратной стороне.

Я бы предпочел показывать прогресс на основе данных, поступающих на сервер, или вообще не иметь буфера. Кто-нибудь знает, как я могу это сделать?

Ответы [ 2 ]

1 голос
/ 03 апреля 2010

Вы просматривали ASIHTTPRequest для мониторинга прогресса? Если я правильно помню (а я могу и не знать), код позволяет настраивать интервалы «чанка» прогресса обновления.

0 голосов
/ 12 августа 2010

На домашней странице ASIHTTPRequest:

Отслеживание прогресса для загрузки, где тело запроса меньше 128 КБ В настоящее время это невозможно. Для запросов больше чем 128KB, делегаты прогресса не будет получать информацию о прогресс первого 128КБ поста данные. Это из-за ограничений в API CFNetwork.

Затем он добавляет:

Обновление от 21 июня 2009 г .: Замечательно люди в Apple были достаточно любезны, чтобы адрес мой отчет об ошибке! В айфоне 3.0 SDK, похоже, размер буфера был уменьшен до 32 КБ, что делает точное отслеживание прогресса загрузки намного надежнее.

Я установил демонстрационное приложение на свой iPhone и попытался загрузить файл размером ~ 140 КБ, и прогресс все еще не представляется точным. Из моих выводов, да, размер буфера был уменьшен до 32 КБ, но метод обратного вызова вызывается только после того, как 4 из этих буферов были заполнены (поэтому он достиг 128 КБ). Индикаторы прогресса остаются бесполезными для небольших файлов.

...