2011-10-31 45 views
0

我有一個計算過程需要相當多的時間來執行,所以UIActivityIndicatorView似乎是合適的。我有一個按鈕來啓動計算。UIActivityIndi​​catorView長計算過程

我試過在計算開始時在計算開始時在IBAction[calcActivity stopAnimating];之間放置了命令[calcActivity startAnimating];但是沒有顯示。

接下來,我創建了一個新的IBAction包含起點,並與到計算IBAction通話和循環虛擬停止只是給了startAnimating一點機會得到兩者之間展開。這也不起作用。

骨骼代碼如下所示:

- (IBAction)computeNow:(id)sender { 
    [calcActivity startAnimating]; 
    for (int i=0; i<1000; ++i) { } 
    [self calcStats]; 
    [calcActivity stopAnimating]; 
    } 

- (IBAction)calcStats { 
    // do lots of calculations here 
    return; 
    } 
+0

您不應該在主線程中執行長計算。 – Phlibbo

回答

1

好吧,我評論說,你永遠不應該performe在你的主線程複雜的計算。它不僅會導致像你這樣的情況,你的應用程序也可能會被拒絕。

現在,UIActivityIndi​​catorView不被更新的原因是,UI實際上並沒有自己更新,例如當你打電話給[calcActivity startAnimating];時,它會在你的代碼運行完畢後得到更新。在你的情況下,這意味着startAnimatingstopAnimating立即被調用,所以沒有真正發生。

因此,'簡單'的解決方案:使用this techniques或者更好的GCD開始一個新的線程。

1

感謝您的推動,Phlibbo。我是新來的這個遊戲,並感謝所有的幫助。我沒有理解你提供的鏈接的所有信息,但它促使我進一步尋找例子。我發現一個運作良好。 IBAction'computeNow'由計算按鈕觸發。代碼現在看起來像這樣:

- (IBAction)computeNow { 
    [calcActivity startAnimating]; 
    [self performSelector:@selector(calcStats) withObject:nil afterDelay:0]; 
    return; 
} 

- (void) calcStats { 
    // Lots of tedious calculations 
    [calcActivity stopAnimating]; 
} 
+0

你應該在答案中編輯你的帖子,而不是'評論'。另外,如果有幫助,請接受我的回答:) – Phlibbo

相關問題