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];
}