Прогресс 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) отправитель;
Другие вопросы по тегам