我的应用程序用一堆 For 循环做了很多工作。它计算了大量的字符串,并且可能需要整整一分钟才能完成。
所以我在我的应用程序中放置了一个 NSProgressIndicator。
在循环中,我使用了 NSProgressIndicator 的“incrementBy”函数。但是,我没有看到实际的酒吧填满。
我怀疑这是因为循环占用了所有可能的能量,因此 NSProgressIndicator 没有更新(以图形方式)。
那我怎么让它进步呢?
我的应用程序用一堆 For 循环做了很多工作。它计算了大量的字符串,并且可能需要整整一分钟才能完成。
所以我在我的应用程序中放置了一个 NSProgressIndicator。
在循环中,我使用了 NSProgressIndicator 的“incrementBy”函数。但是,我没有看到实际的酒吧填满。
我怀疑这是因为循环占用了所有可能的能量,因此 NSProgressIndicator 没有更新(以图形方式)。
那我怎么让它进步呢?
您的for
循环是在主线程还是在后台线程中运行?如果它们在主线程上运行,GUI 将永远不会有机会更新自身以反映进度更改,因为这只会在运行循环结束时发生,即在您的函数完成运行之后。
如果您的for
循环在后台运行,那么您就是淘气!您不应该从除主线程之外的任何地方更新 GUI。如果您的目标是现代系统,则可以使用 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
相互同时运行,因此如果您的循环需要以串行方式运行,则这将不适用。