2011-05-20 50 views
1

想象一下,我有一個微調,我必須啓用相對較重的事情,然後在任務完成後關閉微調器。做一個需要更新屏幕的任務

如果我做的:

[mySpinner startAnimating]; 
[self doSomethingHeavy]; 
[mySpinner stopAnimating]; 

我將永遠不會看到微調運行,因爲doSomethingHeavy將鎖的線程,絕不讓微調錶演。

我試圖在主線程上使用Grand Central Dispatch for the spinner在另一個任務中嘗試啓動一個新的隊列,但結果是一樣的。沒有微調運行。

只有這樣,才能使其正常工作是一個延遲火的方法,使用

[self performSelector:@selector(doSomethingHeavy) withObject:nil afterDelay:0.02]; 

但是這聽起來更像是一個黑客,如果我把[mySpinner stopAnimating]該行之後,任務完成前可能會停止微調。

這不僅適用於微調器,而且適用於需要屏幕更新的任何任務。

回答

0

我已經嘗試了這些解決方案,但不幸的是沒有工作,因爲我的doSomethingHeavy方法也必須在主線程上運行。

使用延遲觸發方法的hack工作,但不適用於應該運行多個參數的方法,如performSelector:afterDelay:不能用於傳遞多個參數。

我發現了一個解決方案,使用Grand Central Dispatch在主線程上激發隊列,然後將其休眠0.02秒。使用隊列,我可以放任何我想要的東西。

0

希望我在正確理解的問題,但通常我會使用的方法

[self performSelectorInBackground:@selector(doSomethingHeavy) withObject:nil]; 

在這種情況下,因爲這葉子免費更新UI,同時在後臺仍執行該任務的主線程。

4
... 
    [mySpinner startAnimating]; 
    [self performSelectorInBackground:@selector(doSomethingHeavy) withObject:nil]; 
    ... 
} 


- (void)doSomethingHeavy { 
    ... 

    [mySpinner performSelectorOnMainThread:@selector(stopAnimating) withObject:nil waitUntilDone:NO]; 
} 

,而不是通過調用停止微調在doSomethingHeavy它會更likley完成或者:

[self performSelectorOnMainThread:@selector(finishedSomethingHeavy) withObject:nil waitUntilDone:NO]; 

這將停止微調和更新與重結果的UI。