2011-08-22 30 views
2

我的應用程序用一堆For循環做了很多工作。它會計算大量的字符串,並且可能需要一整分鐘才能完成。NSProgressIndicator進展For循環?

所以我在我的應用程序中放置了一個NSProgressIndicator。

在循環中,我使用了NSProgressIndicator的「incrementBy」函數。但是,我沒有看到實際的酒吧填滿。

我懷疑這是因爲循環採取了所有可能的功能,因此NSProgressIndicator沒有更新(圖形)。

我該如何讓它進步呢?

回答

4

您的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循環要求以串行方式運行。