UIKit和GCD线程安全

时间:2013-04-30 12:23:50

标签: ios uikit grand-central-dispatch

许多帖子都说UIKit完全不是线程安全的。现在在GCD的Apple文档中,我们可以看到它是不是线程安全的DRAWING。那么这样的代码就可以了:

  
    

dispatch_async(^ {

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

});

  

2 个答案:

答案 0 :(得分:2)

我个人认为,到目前为止你所听到的内容都是误导性的。

以下是来自Apple UIKit Framework Reference的报价,归功于类似的帖子here

  

注意:在大多数情况下,UIKit类只能用于   应用程序的主要线程。对于课程尤其如此   源自UIResponder或涉及操纵你的   应用程序的用户界面。

此外,请注意,根据release notes found here,从iOS4开始,与您的假设相反,

  

在UIKit中绘制图形上下文现在是线程安全的。   具体来说:

     
      
  • 用于访问和操作图形上下文的例程现在可以正确处理驻留在不同线程上的上下文。
  •   
  • 字符串和图像绘制现在是线程安全的。
  •   
  • 现在可以安全地使用多个线程中的颜色和字体对象。
  •   

事实上,在WWDC 2012会话“构建并发用户界面”中,Apple工程师演示了在后台线程中绘制图像图形上下文

我的外卖:

  • 您可以使用多线程绘图,但不要假设任何内容。仅使用Apple明确声明的内容。
  • 再一次,假设一无所获。请勿触摸从后台线程继承自 UIResponder 的任何UIKit内容。

答案 1 :(得分:0)

在这个例子中,你没有改变任何值,所以是的,没关系。从后台线程更新UI不是。