UIKit绘图是线程安全的:你如何获得图形上下文?

Amy*_*all 9 uikit ios

因此,正如本答案iOS 4.0发行说明中所述,UIKit现在有一些线程安全的绘图工具:

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

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

这很好,但是你如何使用它?

据我所知,只要你不在里面,-drawRect:你只能使用UIKit/UIGraphics绘制,如果你通过UIGraphicsBeginImageContext()或创建自己的上下文UIGraphicsPushContext(),但根据文档,这些函数不是线程安全的,并且-drawRect()是总是在主线程上调用.

我假设在主线程上创建一个图像上下文然后启动后台方法将是一个非常糟糕的主意,因为竞争条件很多.

那么,我如何使用iOS 4中引入的基于多线程UIKit的绘图内容?我错过了哪些其他方式获得活跃的UIKit图形上下文?

PS我知道我可以使用Core Graphics进行绘制并完成它.由于各种原因(遗留代码),我想继续使用基于UIKit的绘图方法.

Rob*_*ier 8

基于尝试它并基于各种文档的一些经验,我的信念是,文档UIGraphicsPushContext()是不正确的.

我相信UIGraphicsPushContext()其实是线程安全的.这是真实的特殊迹象是QA1637,它说"从iOS 4.0开始,在UIKit中绘制到图形上下文是线程安全的.这包括访问和操作当前图形堆栈,绘制图像和字符串,以及颜色的使用和来自辅助线程的字体对象." (强调我的)

我承认,假设线程安全与文档相矛盾,这总是一个冒险的主张.但我相信这是一个文档错误.我打开了rdar:// 11161530来跟踪它.请欺骗.

  • 我肯定开始认为它是框架中的一个错误.还不是100%,但我们认为崩溃只发生在需要字体替换时:我们的一些文本中有一些细线空间字符,这些字符在我们想要使用的字体中找不到.删除有问题的字符似乎正在起作用.当他们回到我身边时,我会向DTS报告. (2认同)