因此,如
this answer和
the iOS 4.0 release notes所述,UIKit现在有一些线程安全的绘图设施:
Drawing to a graphics context in UIKit is now thread-safe. Specifically:
- The routines used to access and manipulate the graphics context can now correctly handle contexts residing on different threads.
- String and image drawing is now thread-safe.
- Using color and font objects in multiple threads is now safe to do.
这很好,但是你如何使用它?
据我所知,任何时候你都不在-drawRect中:如果你通过UIGraphicsBeginImageContext()或UIGraphicsPushContext()创建了自己的上下文,你只能使用UIKit / UIGraphics绘制,但这些函数不是根据文档线程安全,并且总是在主线程上调用-drawRect().
我假设在主线程上创建一个图像上下文然后启动后台方法将是一个非常糟糕的主意,因为竞争条件很多.
那么,我如何使用iOS 4中引入的基于多线程UIKit的绘图内容?我错过了什么其他方式获得活跃的UIKit图形上下文?
附:我知道我可以使用Core Graphics进行绘制并完成它.由于各种原因(遗留代码),我想继续使用基于UIKit的绘图方法.
解决方法
基于尝试它并基于各种文档的一些经验,我的信念是UIGraphicsPushContext()的文档是不正确的.
我相信UIGraphicsPushContext()实际上是线程安全的.这是真实的特殊指示是QA1637,其中说“从iOS 4.0开始,在UIKit中绘制到图形上下文是线程安全的.这包括访问和操作当前图形堆栈,绘制图像和字符串,以及颜色的使用和来自辅助线程的字体对象.“ (强调我的)
我承认,假设线程安全与文档相矛盾,这总是一个冒险的主张.但我相信这是一个文档错误.我已经打开了rdar://11161530跟踪它.请欺骗.