Прогресс NSProgressIndicator для циклов For?
Мое приложение много работает с кучей циклов For. Он рассчитывает огромное количество строк, и может потребоваться целая минута, чтобы закончить.
Поэтому я поместил NSProgressIndicator в свое приложение.
В циклах я использовал функцию "incrementBy" NSProgressIndicator. Тем не менее, я не вижу фактического заполнения бара.
Я подозреваю, что это из-за циклов, берущих всю возможную мощность, и, таким образом, NSProgressIndicator не обновляется (графически).
Как мне добиться прогресса?
2 ответа
Ваш for
циклы, работающие в основном потоке или в фоновом потоке? Если они выполняются в главном потоке, графический интерфейс никогда не получит возможность обновить себя, чтобы отразить изменение прогресса, поскольку это произойдет только в конце цикла выполнения, т.е. после завершения выполнения ваших функций.
Если твой for
петли бегут на заднем плане, ты шалишь! Вы не должны обновлять графический интерфейс нигде, кроме основного потока. Если вы ориентируетесь на современную систему, вы можете использовать GCD, чтобы обойти это.
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^(void) {
for (int i = 0; i < n; i++) {
// do stuff
dispatch_async(dispatch_get_main_queue(), ^(void) {
// do your ui update here
});
}
});
Кроме того, вы можете переписать свой for
циклы, чтобы использовать преимущества GCD еще больше и использовать dispatch_apply
, Эквивалент вышеупомянутого будет:
dispatch_apply(n, DISPATCH_QUEUE_PRIORITY_DEFAULT, ^(size_t i) {
// for loop stuff here
dispatch_async(dispatch_get_main_queue(), ^(void) {
// do your ui update here
});
});
Обратите внимание, что с помощью dispatch_apply
означает, что каждая "итерация" цикла может выполняться одновременно по отношению друг к другу, поэтому это не будет применимо, если ваш for
Цикл требует запуска в последовательном режиме.
Извините, что не обратил внимания на время публикации, возможно, вы можете использовать его:
- (void) startAnimation: (nullable id) отправитель;
- (void)stopAnimation:(nullable id) отправитель;