Приложение не обновляет экран, отображая UIActivityIndicatorView
, пока основной цикл выполнения не восстановит управление.Если ваша задача обработки блокирует основной поток, обновления пользовательского интерфейса не будут выполняться до ее завершения.Вы должны выполнять свою обработку асинхронно.
Когда происходит событие поворота, методы willRotate...
и willAnimateRotation...
вызываются за один проход через главный цикл выполнения.Таким образом, вы блокируете метод перед отображением индикатора активности.
Чтобы это работало, вам нужно перенести задачу метода в другой поток.Этот метод будет вызывать этот контроллер представления, когда работа будет завершена, чтобы представление могло быть обновлено.Я бы поставил показывать индикатор активности в методе willAnimateRotation...
.
Вам нужно заставить UIActivityIndicatorView
начать отображение, даже если цикл выполнения не будет завершен.Один из способов -
[self performSelector:@selector(animation) withObject:nil afterDelay:0]
-(void)startSpinner
{
NSAutoreleasepool *pool = [[NSAutorepleasepool alloc]init];
[indicatorView startAnimating];
[pool release];
}
По сути, performSelector
устанавливает таймер для выполнения сообщения animation
в цикле выполнения текущего потока.Таймер настроен для работы в режиме по умолчанию (NSDefaultRunLoopMode
).Когда таймер срабатывает, поток пытается удалить сообщение из цикла выполнения и выполнить селектор.Это успешно, если цикл выполнения работает и в режиме по умолчанию;в противном случае таймер ожидает, пока цикл выполнения не перейдет в режим по умолчанию.
Обратите внимание, что указание задержки 0 не обязательно приводит к немедленному выполнению селектора.Селектор все еще находится в очереди в цикле выполнения потока и выполняется как можно скорее.