在一個項目中,我更改UILabel的文本用的setText,一個UIButton的顏色,之後做一個耗時的計算,其次是動畫。更新的UILabel和UIButton的立即
然而,在執行計算後的文本的和顏色的改變反映(和動畫開始之前),但是我要計算之前立即反映更改(如你猜它是一個等待文本)
如何我可以做到這一點嗎?
在一個項目中,我更改UILabel的文本用的setText,一個UIButton的顏色,之後做一個耗時的計算,其次是動畫。更新的UILabel和UIButton的立即
然而,在執行計算後的文本的和顏色的改變反映(和動畫開始之前),但是我要計算之前立即反映更改(如你猜它是一個等待文本)
如何我可以做到這一點嗎?
將計算移出主線程。當運行循環獲取的時間內進行
所有的繪製。如果您正在主線程上執行計算,則會阻止運行循環並因此阻止繪圖。計算完成後,使用performSelectorOnMainThread啓動動畫或在計算完成時需要在UI中發生的其他任何事情。
編輯:
主線程上執行你的計算,但給運行循環的機會,更新UI是一個延遲調用的快捷方式。使用0.1秒左右的延遲。你可以用NSTimer做基本相同的事情。這是NSRunLoop.h
- (void)performSelector:(SEL)aSelector withObject:(id)anArgument afterDelay:(NSTimeInterval)delay;
開始在後臺線程中運行計算。
我認爲你最好的選擇是在後臺線程中執行你耗時的動畫。這樣你的主UI線程就不會被阻塞,文本和顏色也會立即改變。您的UI在執行計算時也會保持響應。
總的來說這是一個好主意,不要堵塞了沉重的計算主線程,因爲這給人的應用不是非常敏感的外觀。
如果在計算最簡單的方法是避免線程,你並不需要一個負責任的接口:把時間在自己的方法耗時計算,並啓動使用[calculator performSelector:@selector(calculateThis:) withObject:myArgument afterDelay:0]
。
這將允許運行的循環更新您界面的變化,然後開始在主線程的計算(阻止它)。
開始音頻錄製的完美解決方案,在第一次初始化時可能會有幾秒鐘的設置延遲,因此阻止該線程對我來說很有意義。 – 2011-02-16 12:43:37
其實計算的阻止用戶界面是爲我好,是不是有沒有辦法跟你說做我的更新,然後開始計算,並且你可以自由地阻止任何「:) – 2010-05-07 09:10:43
您可以放心地指定一個零延遲。這使程序流程返回到運行循環,然後立即執行延遲的方法。 – 2010-05-07 10:48:17