IPhone UIActivityIndicator не будет отображаться до тех пор, пока процесс не будет завершен - PullRequest
1 голос
/ 31 декабря 2011

Я исследовал это в течение нескольких дней, но ничего не нашел работ.

Вот требуемый процесс: пользователь нажимает кнопку ввода во всплывающем окне -> Появляется ActivityIdicator ->происходит сохранение -> ActivityIndicator исчезает.

Однако по какой-то причине ActivityIndicator не отображается до тех пор, пока процесс не завершится, что делает его абсолютно бесполезным.

Я попытался выполнить описанный процессздесь: UIActivityIndicator не работает должным образом?

Вот код для всплывающего окна

-(void)alertView:(UIAlertView *)actionSheet clickedButtonAtIndex:(NSInteger)buttonIndex {
    // the user clicked one of the Enter/Cancel buttons
    [self performSelector:@selector(DisplaySpinner) withObject:nil afterDelay:0];
    if (buttonIndex == 1)
    {
        [self performSelector:@selector(EnterButtonClicked) withObject:nil afterDelay:0];
    }
    else
    {
        NSLog(@"Name Cancel Clicked");
    }
    [NameField resignFirstResponder];
    }

Вот код для метода DisplaySpinner:

-(void)DisplaySpinner{
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc]init];

    [self.view addSubview:loadingIndicator];
    [loadingIndicator startAnimating];

    [pool release];
}

Метод EnterButtonClicked содержит процесс сохранения.Несмотря на запуск в отдельных процессах, ActivityIndicator не отображается до тех пор, пока процесс не будет завершен.

Есть предложения?

1 Ответ

3 голосов
/ 31 декабря 2011

Приложение не обновляет экран, отображая 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 не обязательно приводит к немедленному выполнению селектора.Селектор все еще находится в очереди в цикле выполнения потока и выполняется как можно скорее.

...