2013-04-30 134 views
1

許多帖子都說UIKit完全不是線程安全的。現在在GCD的Apple文檔中,我們可以看到它的繪圖不是線程安全的。所以會像這樣的代碼即可:UIKit和GCD線程安全

dispatch_async(^ {

//do some work 
if(!self.window.rootViewController.presentedViewController &&) 
    [self.window.rootViewController class] == anotherClass) 
    { 
     dispatch_async(dispatch_get_main_queue(), ^{ //do some work }); 
    } 

});

+1

那麼,考慮到rootViewController被聲明爲'@property(nonatomic,retain)UIViewController * rootViewController',我想不會。 – Mar0ux 2013-04-30 12:27:35

+0

爲什麼不直接在主線程上進行調度測試。在主線以外的其他線程上使用UI元素時會出現火災,即使它在iOS 6中正常工作,您的應用可能會在iOS 7中發生嚴重失敗。 – 2013-04-30 12:41:20

+0

導致該塊位於另一個dispatch_async()中的while循環中,否則該循環將阻止主線程。 – foFox 2013-04-30 12:44:23

回答

0

在這個例子中,你沒有改變任何值,所以是的,沒關係。從後臺線程更新UI不是。

+0

這幾乎是我的問題,很多人說你根本不應該從另一個線程觸及UIKit,但後來我讀到它是更新,重繪,這不是線程安全的,這是有點混淆。 – foFox 2013-05-01 10:24:57

+0

閱讀蘋果關於多線程,塊和相關內容的指南,您將會了解到底如何實現這些內容。那麼你會看到爲什麼讀取或檢查非線程安全代碼的值是安全的,以及爲什麼改變或更新值不是上帝的想法。 UIKit不是一個例外,它只是另一個非線程安全的類集合。 – TheBlack 2013-05-01 17:36:12

2

我的個人意見是,你迄今聽到的是誤導。

下面是來自蘋果的UIKit Framework Reference報價,信用類似的線程here

注:在大多數情況下,UIKit類應該僅僅從 應用程序的主線程中使用。對於從UIResponder派生的類 或者涉及以任何方式操縱應用程序的用戶界面的情況尤其如此。

此外,請注意,從iOS4的,相反,你認爲什麼開始,根據release notes found here

繪製在UIKit的圖形上下文現在是線程安全的。 具體來說:

  • 用於訪問和操縱圖形上下文現在可以正確處理駐留在不同的線程的上下文中的例程。
  • 字符串和圖像繪製現在是線程安全的。
  • 在多個線程中使用顏色和字體對象現在可以安全地使用。

事實上此外,在WWDC 2012屆「構建併發用戶界面」,蘋果電腦的工程師演示繪製成圖像圖形在後臺線程上下文

我的外賣:

  • 您可以使用多線程繪圖,但不要假設任何事情。只使用Apple明確聲明的內容。
  • 再次,不要假設。請勿觸摸任何從後臺線程中繼承的UIResponder的UIKit內容。