gpt4 book ai didi

objective-c - NSProgressIndicator 在循环结束之前不会更新

转载 作者:行者123 更新时间:2023-12-03 17:31:15 26 4
gpt4 key购买 nike

我正在制作一个对多个文件进行大量计算的应用程序,因此为了跟踪正在发生的所有事情,我添加了一个 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

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

最佳答案

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

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

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

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

关于objective-c - NSProgressIndicator 在循环结束之前不会更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33047973/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com