UIActivityIndicatorView для длительного вычислительного процесса - PullRequest
0 голосов
/ 31 октября 2011

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

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

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

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

- (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 ]

1 голос
/ 01 ноября 2011

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

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

- (void) calcStats {
    // Lots of tedious calculations
    [calcActivity stopAnimating];
}
1 голос
/ 01 ноября 2011

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

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

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

...