我的應用程序用一堆For循環做了很多工作。它會計算大量的字符串,並且可能需要一整分鐘才能完成。NSProgressIndicator進展For循環?
所以我在我的應用程序中放置了一個NSProgressIndicator。
在循環中,我使用了NSProgressIndicator的「incrementBy」函數。但是,我沒有看到實際的酒吧填滿。
我懷疑這是因爲循環採取了所有可能的功能,因此NSProgressIndicator沒有更新(圖形)。
我該如何讓它進步呢?
我的應用程序用一堆For循環做了很多工作。它會計算大量的字符串,並且可能需要一整分鐘才能完成。NSProgressIndicator進展For循環?
所以我在我的應用程序中放置了一個NSProgressIndicator。
在循環中,我使用了NSProgressIndicator的「incrementBy」函數。但是,我沒有看到實際的酒吧填滿。
我懷疑這是因爲循環採取了所有可能的功能,因此NSProgressIndicator沒有更新(圖形)。
我該如何讓它進步呢?
您的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
循環要求以串行方式運行。