2013-04-30 90 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内容。