0

Я делаю приложение, которое делает очень большой объем вычислений для нескольких файлов, и поэтому для отслеживания всего, что происходит, я добавил NSProgressIndicator (значения 0 -100).NSProgressIndicator не обновляется до конца цикла

У меня также есть консоль в приложении, поэтому метод logConsole: записывает на эту консоль.

Мой цикл выглядит следующим образом:

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^(void){ 

    for(int i = 0; i < _files.count; i++) 
    { 

     //Do calculations 

     dispatch_async(dispatch_get_main_queue(), ^(void){ 

      [_progressBar setDoubleValue: ((i+1)/_files.count) * 100]; 
      [self logConsole:[NSString stringWithFormat:@"Completed file #%d", (i+1)]]; 

     }); 

    } 

}); 

При этом запускается цикл, сообщения записываются в консоли приложения (не NSLog, фактический GUI консоли я сделал) асинхронно, но индикатор не до тех пор, пока весь цикл цикла не завершится.

Так что, если было 5 файлов он будет выглядеть следующим образом:

LOG: Completed file #1 
Progress bar at 0 
LOG: Completed file #2 
Progress bar at 0 
LOG: Completed file #3 
Progress bar at 0 
LOG: Completed file #4 
Progress bar at 0 
LOG: Completed file #5 
Progress bar at 100 

Почему не обновление прогресс бар? Он работает по основной теме.

+0

Ваш журнал очень глупый. Ключевое значение в вашем коде: '((i + 1)/_files.count) * 100', но вы не регистрируете его, чтобы узнать, имеет ли смысл. – matt

+0

@matt 'logConsole:' представляет информацию пользователю, а не мне как разработчику. Это должно быть красивым, а не отлаживать. – David

+0

Это ничего не меняет. Ваш вопрос: «Почему не обновляется индикатор выполнения»? Способ узнать - посмотреть на значения, которые вы настраиваете. Вы не смотрите. – matt

ответ

4

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

double progress = (((double)i) + 1.0)/((double)_files.count); 
[_progressBar setDoubleValue:progress * 100.0]; 

Стоит также отметить, что вам не придется умножать на 100,0, если вы установите minValue и maxValue бара прогресса надлежащим образом (по умолчанию 0,0 и 100,0). Вы бы поставили это в, скорее всего:

[_progressBar setMinValue:0.0]; 
[_progressBar setMaxValue:1.0]; 
+0

Я изменил его, чтобы использовать удвоения для каждого номера, но он по-прежнему не обновляется. – David

+0

Подождите, пока он работает. – David

+0

Ха-ха, чтобы сработать целым делением через 6 лет, как программист - смиренный момент :) – David

Смежные вопросы