NSProgressIndicator进展For循环?

时间:2011-08-22 00:46:16

标签: objective-c nsprogressindicator

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

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

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

我怀疑这是因为循环使所有功能成为可能,因此NSProgressIndicator没有更新(图形化)。

我如何才能取得进展呢?

1 个答案:

答案 0 :(得分:5)

您的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这将不适用循环需要以串行方式运行。