2010-05-07 67 views
1

在一個項目中,我更改UILabel的文本用的setText,一個UIButton的顏色,之後做一個耗時的計算,其次是動畫。更新的UILabel和UIButton的立即

然而,在執行計算後的文本的和顏色的改變反映(和動畫開始之前),但是我要計算之前立即反映更改(如你猜它是一個等待文本)

如何我可以做到這一點嗎?

回答

2

將計算移出主線程。當運行循環獲取的時間內進行

所有的繪製。如果您正在主線程上執行計算,則會阻止運行循環並因此阻止繪圖。計算完成後,使用performSelectorOnMainThread啓動動畫或在計算完成時需要在UI中發生的其他任何事情。

編輯:

主線程上執行你的計算,但給運行循環的機會,更新UI是一個延遲調用的快捷方式。使用0.1秒左右的延遲。你可以用NSTimer做基本相同的事情。這是NSRunLoop.h

- (void)performSelector:(SEL)aSelector withObject:(id)anArgument afterDelay:(NSTimeInterval)delay;

+0

其實計算的阻止用戶界面是爲我好,是不是有沒有辦法跟你說做我的更新,然後開始計算,並且你可以自由地阻止任何「:) – 2010-05-07 09:10:43

+0

您可以放心地指定一個零延遲。這使程序流程返回到運行循環,然後立即執行延遲的方法。 – 2010-05-07 10:48:17

0

開始在後臺線程中運行計算。

0

我認爲你最好的選擇是在後臺線程中執行你耗時的動畫。這樣你的主UI線程就不會被阻塞,文本和顏色也會立即改變。您的UI在執行計算時也會保持響應。

總的來說這是一個好主意,不要堵塞了沉重的計算主線程,因爲這給人的應用不是非常敏感的外觀。

1

如果在計算最簡單的方法是避免線程,你並不需要一個負責任的接口:把時間在自己的方法耗時計算,並啓動使用[calculator performSelector:@selector(calculateThis:) withObject:myArgument afterDelay:0]

這將允許運行的循環更新您界面的變化,然後開始在主線程的計算(阻止它)。

+0

開始音頻錄製的完美解決方案,在第一次初始化時可能會有幾秒鐘的設置延遲,因此阻止該線程對我來說很有意義。 – 2011-02-16 12:43:37