2012-07-18 34 views
0

我在工作的應用程序中有一個功能,與其他操作相比,它有時需要相當長的時間。我希望在執行該功能時顯示圖像,以向用戶顯示應用程序仍能正常工作。何時刷新UIView?是否有可能強制中功能刷新?

的方式我儘管可以做的是:

_checkImpossibleImage.hidden = NO; 
bool ratioIsPossible = [PaintGame isPossible:_paintChipRatio:_paintCanRatios]; 
_checkImpossibleImage.hidden = YES; 

從本質上講,這將圖像設置爲可見,執行的功能,然後將圖像設置爲不可見。但是,直到執行本節中的所有代碼之後,視圖纔會更新。下面是功能全面:

- (void)alertView:(UIAlertView *)actionSheet clickedButtonAtIndex:(NSInteger)buttonIndex 
{ 
    if (buttonIndex == 0){ 
     // Do nothing (cancel option selected) 
    } else { 
     if (_buttonKey == @"New") { 

      _checkImpossibleImage.hidden = NO; 
      bool ratioIsPossible = [PaintGame isPossible:_paintChipRatio:_paintCanRatios]; 
      _checkImpossibleImage.hidden = YES; 

      ... 
     } 
    ... 
    } 
} 

有沒有辦法來迫使當前視圖更新或是否有更好的方法來創建一個「加載」彈出而函數執行?

+0

你可能想看看進入[UIView文檔](http://developer.apple.com/library/ios/documentation/uikit/reference/uiview_class/uiview/uiview.html#//apple_ref/occ/instm/UIView/setNeedsDisplay),特別是'needsDisplay'這將強制重繪。但是,我不知道發生在功能中間的重繪。 – 2012-07-18 00:06:18

+0

基本上同樣的問題:[UIActivityIndi​​cator工作不正常?](http://stackoverflow.com/questions/2919879/uiactivityindicator-not-working-properly) – 2012-07-18 00:33:24

+0

此解決方案工作!謝謝你指出我朝着正確的方向。 – Valentine 2012-07-18 17:34:42

回答

0

當你這樣做的時候,你不應該阻塞UI,我認爲如果你只是在一個單獨的線程中調用花費很長時間的方法會更好。

+0

我不認爲它會在另一個線程中調用該函數,因爲它對於以下應用程序行爲至關重要。完成時間不需要很長的時間,大概是10秒,但我認爲通知用戶此事件正在發生將是有益的。 – Valentine 2012-07-18 00:25:43

+0

如果在此方法完成之前應用程序無法繼續,則可以在您調用該方法之前向用戶顯示一些「加載...」視圖。 – Eyal 2012-07-18 00:30:05

+1

實際上10s太長以至於無法阻止用戶界面。你應該在後臺進行處理,然後發送通知(或類似的)讓你的應用繼續下一步。 – nielsbot 2012-07-18 00:43:04

0

繪圖直到運行循環結束纔會發生;在代碼中間無法實現它。你可以把它放在主調度隊列延遲,直到循環的下一次復飛的呼叫isPossible::(這是一個貧窮的方法名,順便說一句):

_checkImpossibleImage.hidden = NO; 
dispatch_async(dispatch_get_main_queue(), ^{ 
     bool ratioIsPossible = [PaintGame isPossible:_paintChipRatio:_paintCanRatios]; 
     _checkImpossibleImage.hidden = YES; 
     // More code to deal with the value of ratioIsPossible 
}); 
+0

我不確定這是否是一個合適的響應,因爲它是作爲對按鈕按下的警報視圖按鈕的響應而發生的,因此推測該功能在下次按下按鈕時纔會再次運行。然而,你能否給我一些關於更好的命名約定的建議? – Valentine 2012-07-18 17:10:05

+0

我不明白你的意見。爲什麼該方法需要再次運行? – 2012-07-18 17:11:29

+0

嗯,也許我只是不太明白你建議的解決方案。當你說循環的下一個復飛時,你的意思是什麼?我對使用Objective-C和Xcode相當陌生,所以我對整個過程和行爲並不特別熟悉。 – Valentine 2012-07-18 17:19:29