Как сделать индикатор выполнения для NSURLConnection при загрузке файла? - PullRequest
24 голосов
/ 15 февраля 2010

Я хочу показать индикатор выполнения во время загрузки с NSURLConnection. Поскольку я получаю данные с сервера, я могу обновлять интерфейс для каждого полученного пакета. Но проблема в том, как выяснить, сколько данных у меня уже есть и сколько данных нужно загрузить? Вероятно, в байтах ... А потом я должен сделать некоторую математику, чтобы получить процент?

1 Ответ

63 голосов
/ 16 февраля 2010

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

- (void)connection: (NSURLConnection*) connection didReceiveResponse: (NSHTTPURLResponse*) response
{
    statusCode_ = [response statusCode];
    if (statusCode_ == 200) {
        download_.size = [response expectedContentLength];
    }
}

А затем обновите прогресс следующим образом:

- (void) connection: (NSURLConnection*) connection didReceiveData: (NSData*) data
{
    [data_ appendData: data];
    download_.progress = ((float) [data_ length] / (float) download_.size);
    // Broadcast a notification with the progress change, or call a delegate
}

В моем случае у меня есть экземпляр загрузки, который имеет свойства size и progress. Они принадлежат глобальному DownloadManager объекту, который позаботится о том, чтобы уведомить заинтересованные стороны о ходе загрузки или изменении состояния.

...