所以,正如this answer和the iOS 4.0 release notes中所提到的,UIKit现在有一些线程安全的绘图工具:
在UIKit中绘制图形上下文现在是线程安全的。具体做法是:
- 用于访问和操作图形上下文的例程现在可以正确处理驻留在不同线程上的上下文。
- 字符串和图像绘制现在是线程安全的。
- 现在可以安全地使用多个线程中的颜色和字体对象。
那太好了,但你怎么用呢?
据我所知,只要您不在-drawRect:
内,只有通过UIGraphicsBeginImageContext()
或{{UIGraphicsPushContext()
创建了自己的上下文,才能使用UIKit / UIGraphics绘图。 1}},但根据文档,这些函数不是线程安全的,并且总是在主线程上调用-drawRect()
。
我认为在主线程上创建一个图像上下文然后启动后台方法将是一个非常糟糕的主意,因为竞争条件很多。
那么,我如何使用iOS 4中引入的基于多线程UIKit的绘图内容?我错过了哪些其他方式获得活跃的UIKit图形上下文?
P.S。我知道我可以使用Core Graphics进行绘制并完成它。由于各种原因(遗留代码),我想继续使用基于UIKit的绘图方法。
答案 0 :(得分:8)
根据一些尝试并基于各种文档的经验,我认为UIGraphicsPushContext()
的文档不正确。
我相信UIGraphicsPushContext()
实际上是线程安全的。这是真实的特殊指示是QA1637,其中说“从iOS 4.0开始,在UIKit中绘制到图形上下文是线程安全的。这包括访问和操作当前图形堆栈 ,绘制图像和字符串,以及从辅助线程使用颜色和字体对象。“ (强调我的)
我承认,假设线程安全与文档相矛盾,这总是一个冒险的主张。但我相信这是一个文档错误。我已打开rdar://11161530来跟踪它。请欺骗。