UIAlertView с UIActivityIndicator обнаруживается слишком поздно / Проблема с многопоточностью - PullRequest
2 голосов
/ 18 октября 2011

В моем приложении есть пара мест, где я вызываю веб-сервис и получаю JSON, который затем разбирается в массивы объектов. Отнимающая много времени часть - это вызов веб-службы. Поведение, которое я желаю, выглядит следующим образом:

  1. Пользователь выбирает интересующую строку
  2. В текущем представлении добавлено AlertView с подпредставлением ActivtiyIndicator
  3. Данные загружаются в новый VC
  4. Появляется новый вид
  5. Индикатор AV пропал

Мои ВК оснащены doLoadData методами, которые в основном загружают массив данных, отображаемых каждым ВК. Например:

AnimalViewController имеет кнопку «Просмотр собак», которая при нажатии делает:

DogViewController *vc = [[DogViewController alloc] init];<br>[self.navigationController pushViewController:vc animated:YES];<br> [vc release];

DogViewController имеет свойство NSArray *dogs и метод doLoadDogs, что требует времени.

В настоящее время у меня есть метод "Просмотр собак":

  1. Создание AlertView с помощью ActivityIndicator
  2. Показать
  3. Создать ВК
  4. Нажми
  5. Скрыть AlertView
  6. Отпустить и обнулить

Кажется, что это не составит труда, но я пока не нашел простой реализации этого с многопоточностью.

1 Ответ

1 голос
/ 18 октября 2011

Если ваш сетевой вызов / создание массива занимает много времени и находится в главном потоке, то все это по существу произойдет одновременно. Когда вы выполняете такие вещи, как отображение предупреждений, нажимаете контроллер навигации и т. Д., То, что вы действительно делаете, - это планирование этих событий на следующем обороте цикла выполнения. Поскольку ваш метод «Просмотр собак» по существу блокируется до тех пор, пока все не будет сделано, цикл выполнения не будет выполняться снова, пока все не потребуется.

Лучшее решение состоит в том, чтобы отделить код загрузки вашей сети, а не блокировать цикл основного потока / основного события. В качестве быстрого исправления вы можете выделить части вашего текущего метода «Просмотр собак» с помощью GCD. В качестве примера (очевидно, это необходимо обновить в соответствии с вашими фактическими требованиями / кодом):

- (void)viewDogs:(id)sender
{
  dispatch_queue_t mainQueue = dispatch_get_main_queue();
  // create and schedule the alert view
  UIAlertView* alert = [[UIAlertView alloc] initWithTitle...]; // your real alert view
  dispatch_async(mainQueue, ^{ [alert show]; });
  dispatch_async(mainQueue, ^{
    DogViewController* vc = [[DogViewController alloc] init];
    [[self navigationController] pushViewController:vc animated:YES];
    [vc release];
    dispatch_async(mainQueue, ^{ [alert dismissWith...]; [alert release]; });
  });
}
...