2011-08-19 32 views
0

在新線程結束時調用主線程將結果應用於UI是否很常見?我們不能應用「分離」線程的結果嗎?例如,在示例代碼ListAdder,我們使用:performElementInBackground之後調用performSelectorOnMainThread?

[self performSelectorInBackground:@selector(threadRecalculateNumbers:) withObject:immutableNumbers]; 

,並在功能上,我們再回到主線:

[self performSelectorOnMainThread:@selector(threadRecalculateDone:) withObject:totalStr waitUntilDone:NO]; 

和功能:

- (void)threadRecalculateDone:(NSString *)result 
{ 
    // The user interface is adjusted by a KVO observer on recalculating. 
    self.formattedTotal = result; 
    self.recalculating = NO; 
} 

謝謝

Paul

+0

(這真的很難看出你的問題是什麼......) – Infinite

+1

「我們不能把我們的結果應用到」分離「線程嗎?」不,用戶界面不能從主線程以外的地方更新。 UIKit不是線程安全的。 – albertamg

+0

@albertamg:感謝albert,所以我們在創建分離線程後總是調用主線程是有道理的。你能作爲一個職位做出答案嗎?非常感謝 – Paul

回答

3

難道我們不能應用我們從「分離」線程得到的結果嗎?

不,用戶界面無法從主線程以外更新。一般而言,UIKit is not thread-safe.

大部分UIKit類只能在 應用程序的主線程中使用。對於從UIResponder派生的類 或者涉及以任何方式操縱應用程序的用戶界面的情況尤其如此。

這就是爲什麼常見的做法是在後臺執行長時間運行的任務,然後調用performSelectorOnMainThread來更新UI。

雖然beginning with iOS 4.0,繪製到UIKit中的圖形上下文是線程安全的。具體而言,訪問和操作當前的圖形堆棧,繪製圖像和字符串,以及從輔助線程使用顏色和字體對象。

相關問題