NSProgressIndicator直到循环结束才更新

时间:2015-10-09 22:21:16

标签: objective-c cocoa for-loop dispatch-async nsprogressindicator

我正在制作一个为多个文件进行大量计算的应用程序,因此为了跟踪正在发生的一切,我添加了一个NSProgressIndicator(值为0-100)。

我在应用程序中也有一个控制台,因此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控制台),但进度条在整个for循环完成之前不会改变。

因此,如果有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

为什么进度条没有更新?它正在主线程上运行。

1 个答案:

答案 0 :(得分:4)

看起来你正在进行整数数学运算,它永远不会产生浮点值。您必须将您的值转换为double才能执行此操作。

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

还值得一提的是,如果您正确设置进度条的minValuemaxValue,则不必乘以100.0(默认值为0.0和100.0) )。您最希望将其放在viewDidLoad中:

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