2

许多帖子说 UIKit 完全不是线程安全的。现在在 GCD 的 Apple 文档中,我们可以读到 DRAWING 不是线程安全的。所以这样的代码可以吗:

调度异步(^{

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

});

4

2 回答 2

2

我个人的看法是,到目前为止,您所听到的内容具有误导性。

这是来自 Apple 的UIKit 框架参考的引用,归功于此处的类似线程:

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

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

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

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

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

我的外卖:

  • 您可以使用多线程绘图,但不要假设任何东西。仅使用 Apple 明确声明的内容。
  • 再次,假设什么。不要碰任何从后台线程继承自UIResponder的 UIKit 东西。
于 2013-05-02T11:14:21.933 回答
0

在此示例中,您没有更改任何值,所以是的,没关系。不是从后台线程更新 UI。

于 2013-04-30T13:05:33.743 回答