NSProgressIndicator 直到循环结束才更新
NSProgressIndicator doesn't update until the end of the loop
我正在制作一个应用程序,它对多个文件进行大量计算,因此为了跟踪所有发生的事情,我添加了一个 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];
还值得一提的是,如果适当设置进度条的minValue
和maxValue
(默认为0.0和100.0),则不必乘以100.0。您最有可能希望将其放在 viewDidLoad
中:
[_progressBar setMinValue:0.0];
[_progressBar setMaxValue:1.0];
我正在制作一个应用程序,它对多个文件进行大量计算,因此为了跟踪所有发生的事情,我添加了一个 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];
还值得一提的是,如果适当设置进度条的minValue
和maxValue
(默认为0.0和100.0),则不必乘以100.0。您最有可能希望将其放在 viewDidLoad
中:
[_progressBar setMinValue:0.0];
[_progressBar setMaxValue:1.0];