UIActivityIndicatorView для длительного вычислительного процесса

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

Я пытался поставить команду [calcActivity startAnimating]; в начале вычисления в IBAction а также [calcActivity stopAnimating]; в конце вычисления, но ничего не показывает.

Далее я создал новый IBAction содержать старт и остановку с вызовом к вычислению IBAction и фиктивный цикл, чтобы дать старту небольшой шанс начать между ними. Это тоже не работает.

Скелетный код выглядит так:

- (IBAction)computeNow:(id)sender {
    [calcActivity startAnimating];
    for (int i=0; i<1000; ++i) { }
    [self calcStats];
    [calcActivity stopAnimating];
    }

- (IBAction)calcStats {
    // do lots of calculations here
    return;
    }

2 ответа

Решение

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

Теперь причина того, что UIActivityIndicatorView не обновляется, заключается в том, что пользовательский интерфейс фактически не обновляется, например, когда вы вызываете [calcActivity startAnimating]; Вместо этого он обновляется после того, как ваш код прошел. В вашем случае это означает, что startAnimating а также stopAnimating звонят сразу, так что на самом деле ничего не происходит.

Итак, "простое" решение: начать новый поток, используя либо эту технику, либо, возможно, лучше, GCD.

Спасибо за толчок, Флиббо. Я новичок в этой игре и ценю всю помощь. Я не понял всей информации по предоставленным вами ссылкам, но это подтолкнуло меня к дальнейшему поиску примеров. Я нашел тот, который хорошо работает. IBAction 'computeNow' запускается кнопкой расчета. Код теперь выглядит так:

- (IBAction)computeNow {
    [calcActivity startAnimating];
    [self performSelector:@selector(calcStats) withObject:nil afterDelay:0];
    return;
}

- (void) calcStats {
    // Lots of tedious calculations
    [calcActivity stopAnimating];
}
Другие вопросы по тегам