【问题标题】:NSProgressIndicator progress with For loops?NSProgressIndicator For 循环的进度?
【发布时间】:2011-08-22 00:46:16
【问题描述】:

我的应用程序用一堆 For 循环做了很多工作。它计算了大量的字符串,并且可能需要整整一分钟才能完成。

所以我在我的应用中放置了一个 NSProgressIndicator。

在循环中,我使用了 NSProgressIndicator 的“incrementBy”函数。但是,我没有看到实际的条形图填满。

我怀疑这是因为循环占用了所有可能的能量,因此 NSProgressIndicator 没有更新(以图形方式)。

那我该怎么做呢?

【问题讨论】:

    标签: objective-c nsprogressindicator


    【解决方案1】:

    您的for 循环是在主线程还是后台线程中运行?如果它们在主线程上运行,则 GUI 将永远没有机会更新自身以反映进度更改,因为这只会在 runloop 结束时发生,即在您的函数完成运行之后。

    如果您的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 循环需要以串行方式运行。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-04-19
      • 1970-01-01
      相关资源
      最近更新 更多