Установите прогресс в UIProgressView при загрузке с помощью NSURLConnection

Я пытаюсь обновить индикатор выполнения в UIProgressView для запроса на загрузку с помощью NSURLConnection . Цель состоит в том, чтобы обновить индикатор выполнения при загрузке изображения. После нескольких поисков мне удалось использовать didSendBodyData моего делегата соединения, чтобы проверить прогресс следующим образом:

 - (void)connection:(NSURLConnection *)connection didSendBodyData:(NSInteger)bytesWritten totalBytesWritten:(NSInteger)totalBytesWritten totalBytesExpectedToWrite:(NSInteger)totalBytesExpectedToWrite { if([self.delegate respondsToSelector:@selector(progressView)]) { self.delegate.progressView.progress = (totalBytesWritten / totalBytesExpectedToWrite) * 100.0; } } 

Все работает нормально, но проблема в том, что этот метод вызывается только один раз … Таким образом, бар остается на 0% на мгновение, а затем мгновенно переходит на 100% без промежуточного. Я попробовал (с помощью iOS6 develloper tool на iPhone) установить мое соединение с медленным подключением к грани, если это просто моя загрузка, которая слишком быстра, но нет, загрузка займет некоторое время на 0, а затем перейдите на 100% мгновенно и метод вызывается только один раз …

Любая идея, пожалуйста? Спасибо ! Я не могу понять, как это исправить …

One Solution collect form web for “Установите прогресс в UIProgressView при загрузке с помощью NSURLConnection”

Вы действительно должны прочитать C-учебник по числовым типам. Предположительно, как totalBytesWritten и totalBytesExpectedToWrite представляют собой целочисленный тип, поэтому их разделение приведет к усечению – то есть дробная часть результата исчезнет. Если результат не равен 100%, интегральная часть всегда равна 0, поэтому все эти деления приведут к нулю. Попробуйте сделать одну или обе переменные float или double чтобы получить разумные результаты.

Кроме того, UIProgressView не принимает значения от 0 до 100 по умолчанию, но между 0 и 1. В целом вы должны написать

 self.delegate.progressView.progress = ((float)totalBytesWritten / totalBytesExpectedToWrite); 

и он должен работать нормально.

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

  • NSURLConnectionDelegate. Как отменить вызов аутентификации?
  • Внедрение протокола NSURLConnectionDataDelegate
  • NSURLConnectionDownloadDelegate destinationURL
  • Async NSURLConnection и поддерживать жизнь
  • Утечка NSURLConnection в Свифте
  • NSURLConnection повторите попытку 401 статуса
  • Почему NSURLConnection не удалось выполнить с доменом Error Domain = NSURLErrorDomain Code = -1005 «Сетевое соединение было потеряно» в Swift iOS8?
  • Ошибка NSURLConnectionDownloadDelegate
  • как выполнить модульное тестирование делегата NSURLConnection?
  • iOS: HTTP Basic / Digest Auth с UIWebView
  • Код ошибки SSErrorDomain 109. Загрузка новостей с Amazon S3
  • PhoneC: Разработка iOS проста с помощью XCode, Swift3, UITableView, cocatouch, давайте создадим приложения для iPhone, iPad и Macbook.