2012-09-24 79 views
4

我有一個ViewController需要時間來加載其視圖。當我運行樂器時,我從主屏幕上看到,如果我點擊將視圖控制器壓入堆棧的圖標,它將視圖的一半佈置,然後一半獲取視圖的數據。當按下按鈕將LongRunningViewController推入堆棧時,我嘗試添加一個活動指示器以顯示在主屏幕上方的按鈕上。所以我基本上這樣做:顯示活動指標,而加載ViewController

- (IBAction)puzzleView:(id)sender { 
    dispatch_async(dispatch_get_main_queue(), ^{ 
     [self.activityIndicator startAnimating]; 
    }); 

    PuzzleViewController *detailViewController = [[[PuzzleViewController alloc] init] autorelease]; 
    [self.navigationController pushViewController:detailViewController animated:YES]; 
    [self.activityIndicator stopAnimating]; 
} 

主屏幕在按下按鈕時滯後,然後加載視圖。我試圖在其他屏幕準備推送時顯示活動指標(或至少這是我認爲它的工作方式)。然而,活動指示器不顯示。我想知道這是否可以完成?或者其他應用程序推送ViewController,然後在該屏幕上,他們的活動指示器顯示其不同資源的加載情況?

+0

你能澄清你的問題是什麼嗎? –

+0

@Mr。傑弗遜對不起,點擊提交太快! – Crystal

回答

9

當您說需要時間才能獲取視圖的數據時,我認爲您的意思是PuzzleViewControllerviewDidLoad之類的地方做了一些不重要的事情。

所以我們假設它在viewDidLoad。然後,你可以這樣做:

-(void)viewDidLoad 
{ 
    [self.activityIndicator startAnimating]; 
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0),^
    { 
     //do something expensive 
     [self doSomethingExpensive]; 

     //dispatch back to the main (UI) thread to stop the activity indicator 
     dispatch_async(dispatch_get_main_queue(),^
     { 
      [self.activityIndicator stopAnimating]; 
     }); 
    }); 
} 

這將意味着昂貴的操作將被放在一個後臺線程並不會遮擋視線控制器的負載/表現。

此方法在用戶按下按鈕時立即顯示請求的視圖,並在該屏幕上顯示進度。我認爲這比在呈現視圖之前加載內容時顯示活動視圖更常見。這也給你多一點時間;您的長時間操作可以在過渡動畫中在後臺運行!

您的活動視圖沒有顯示您正在執行的方式的原因是您在UI線程中完成了所有操作;使用dispatch_async從主隊列中的主隊列將不會完成任何操作,因爲在運行循環完成之前,您的塊將無法運行。

+0

所以在這種情況下,活動指標是在被加載的頁面上,而不是在ViewController之前? – Crystal

+0

@水晶 - 正確。 –

+0

@Crystal - 如果您的操作足夠長(在過渡動畫之後需要一秒或更多時間),並且完成操作對於顯示視圖控制器至關重要,則應考慮使用[MBProgressHUD](https://github.com/士/ MBProgressHUD)。 –

相關問題