UIKit和GCD线程安全

很多post都说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 }); } 

});

我个人的意见是,你到目前为止所听到的是误导。

以下是Apple的UIKit框架参考的引用 , 这里有一个类似的主题:

注意:在大多数情况下,UIKit类只能从应用程序的主线程中使用。 对于从UIResponder派生的类或者涉及以任何方式操纵应用程序的用户界面的类尤其如此。

此外,请注意,从iOS4开始,与您假设的相反,根据此处的发行说明 ,

在UIKit中绘制图形上下文现在是线程安全的。 特别:

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

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

我的外卖:

  • 您可以使用multithreading绘图,但不要假设任何内容。 仅使用Apple明确声明的内容。
  • 再一次,假设什么。 不要从后台线程触摸任何从UIResponderinheritance的UIKit东西。

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