реализация UIActivityIndicatorView в то время как NSData dataWithContentsOfURL загружается - PullRequest
3 голосов
/ 10 мая 2010

Я загружаю mp3, используя данные NSDataWithContentsOfURL: url. Это занимает некоторое время, и пока файл загружается, приложение зависает. Я хочу справиться хорошо, и в идеале хотел бы показать прогресс загрузки, но не могу найти методы для этого.

Это в UIViewController, и я сделал первую попытку, вставив UIActivityIndicatorView и запустив его вращение до того, как я начну загрузку, затем остановив его вращение после, но ничего не появляется.

Так что мой вопрос на самом деле, пожалуйста, может кто-нибудь сказать мне, как лучше всего с этим справиться? Большое спасибо

Ответы [ 2 ]

4 голосов
/ 10 мая 2010

Ничего не появится, потому что ваш основной поток заблокирован во время загрузки, а основной поток - это то, где происходят обновления пользовательского интерфейса.

Вы должны использовать NSUrlConnection для асинхронной загрузки и реализовать методы делегата для запуска / остановки вашего счетчика.

В качестве альтернативы, если вы хотите использовать NSData s dataWithContentsOfURL:url, вы должны сделать это в отдельном потоке и обновить спиннер в главном потоке до и после его вызова.

3 голосов
/ 10 мая 2010

Вы можете достичь этого, все еще используя синхронные методы, но вам нужно дать циклу выполнения возможность начать анимацию индикатора активности перед началом загрузки.

Этого можно добиться, используя performSelector:withObject:afterDelay: с задержкой 0, чтобы поместить цикл выполнения между началом анимации и загрузкой, или (что еще хуже, более рискованно) вы можете напрямую вызывать цикл выполнения внутри своего кода.

Пример кода:

- (void)loadPart1 {
  activityIndicator = [[[UIActivityIndicatorView alloc]
                        initWithActivityIndicatorStyle:UIA...StyleGray]
                       autorelease];
  activityIndicator.frame = myFrame;
  [self.view addSubview:activityIndicator];
  [activityIndicator startAnimating];
  [self performSelector:@selector(loadPart2) withObject:nil afterDelay:0];
}

- (void)loadPart2 {
  [NSURLConnection sendSynchronousRequest:request returningResponse:&response
                                    error:&error];
  [activityIndicator stopAnimating];
}

Подробнее здесь: http://bynomial.com/blog/?p=15 (прокрутите вниз до Решения 1 или Решения 2).

...