2014-03-04 20 views
0

我想加載一個UIActivityIndicatorView然而,它有一些混淆,然後它應該加載。UIActivityIndi​​catorView not loading as expect

它應該從行[activityIndicatorView startAnimating];開始還是當它到達函數的末尾。

- (void)LoadBuayView{ 
    activityIndicatorView = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleWhiteLarge]; 
    activityIndicatorView.center = self.view.center; 
    activityIndicatorView.backgroundColor = [UIColor grayColor]; 
    [activityIndicatorView hidesWhenStopped]; 
    [self.view addSubview:activityIndicatorView]; 
    [activityIndicatorView startAnimating]; 
} 
- (IBAction) EditSave:(id)sender { 

    [self LoadBuayView]; 

    for(int i =0; i<5; i++) 
    { 
     //Some very long takes time code 
    } 
} 

回答

0

activityIndi​​catorView將在mainThread的下一個runloop中開始動畫,所以你可以認爲它開始於函數結束。

你可以試試下面的代碼顯示指示器視圖:

- (IBAction) EditSave:(id)sender { 
    [self LoadBuayView]; 
    [self performSelector:@selector(doLongTimeTask) withObject:nil afterDelay:0.01]; 

} 

- (void)doLongTimeTask{ 
    for(int i =0; i<5; i++) 
    { 
     //Some very long takes time code 
    } 
} 
0

任何費時的過程不應該發生在主隊列,而是你應該使用異步編程模式作爲Concurrency Programming Guide討論。底線,你不應該阻止主隊列。充其量,阻止主隊列可能導致UX不理想,最糟糕的是,您的應用可能會被iOS看門狗流程所殺死。相反,將耗時的代碼分配給後臺隊列(調度隊列或操作隊列)。您可以創建自己的自定義背景隊列,或GCD你可以利用現有的背景隊列之一的自己:

- (void)loadBuyView{ 
    activityIndicatorView = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleWhiteLarge]; 
    activityIndicatorView.center = self.view.center; 
    activityIndicatorView.backgroundColor = [UIColor grayColor]; 
    [activityIndicatorView hidesWhenStopped]; 
    [self.view addSubview:activityIndicatorView]; 
    [activityIndicatorView startAnimating]; 
} 

- (IBAction) didTouchUpInsideSaveButton:(id)sender { 

    [self loadBuyView]; 

    // always do slow processes on a background queue, not the main queue 

    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ 
     for (int i = 0; i < 5; i++) 
     { 
      // Some code that takes a very long time 
     } 

     // when done, dispatch the stopping of the activity indicator view back to the main queue; 
     // all UI updates should be performed on the main queue 

     dispatch_async(dispatch_get_main_queue(), ^{ 
      [activityIndicatorView stopAnimating]; 
     }); 
    }); 
} 

有關類似上面的異步編程模式的更多信息,請參閱WWDC 2012的視頻Asynchronous Design Patterns with Blocks, GCD, and XPC。有關各種併發編程技術的背景信息,請參閱Concurrency Programming Guide

+0

請注意,我還改變了您的方法名稱以符合已建立的[Cocoa編碼指南:命名方法](https://developer.apple.com/library/ios/documentation/cocoa/conceptual/codingguidelines/Articles /NamingMethods.html)。方法名稱應以小寫字母開頭。 – Rob

相關問題