iOS4 networkActivityIndicatorVisible заблокирован через пользовательский интерфейс - PullRequest
0 голосов
/ 01 декабря 2010

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

Я хочу, чтобы пользователь понял, что блокировка происходит из-за загрузки.

Сначала я попытался использовать

[UIApplication sharedApplication].networkActivityIndicatorVisible = YES;
[self downloadFunction];
[UIApplication sharedApplication].networkActivityIndicatorVisible = NO;

Это приводит к максимальному миганию (по большей части ничего) индикатора активности, поскольку мой запрос блокирует поток пользовательского интерфейса.

Я не могу перевести функцию загрузки в фоновый режим, поскольку я полагаюсь на то, что загруженные данные будут доступны до того, как я нажму на контроллер (может привести к ошибке «Не поддерживается одновременное нажатие одного экземпляра контроллера представления», поскольку нажмите кнопку более одного раза).

Затем я попытался поместить подпредставление с вращающимся колесом поверх вида:

[self performSelectorInBackground:@selector(showActivitySubView) withObject:nil];
or  
[NSThread detachNewThreadSelector: @selector(showActivitySubView) toTarget:self withObject:nil];

но пользовательский интерфейс все еще заблокирован, и мой индикатор просто отображается после завершения загрузки ...

Есть идеи?

1 Ответ

1 голос
/ 01 декабря 2010

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

- (void) doActualWork {
  [self downloadFunction];
  [UIApplication sharedApplication].networkActivityIndicatorVisible = NO;
}

- (void) doWork {
  [UIApplication sharedApplication].networkActivityIndicatorVisible = YES;
  [self performSelector:@selector(doActualWork) withObject:Nil afterDelay:0.05];
}

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...