我对UIGraphicsBeginImageContextWithOptions
线程有点困惑,因为根据UIKit 函数参考 UIGraphicsBeginImageContextWithOptions
应该只在主线程上调用。当被调用时,它会创建一个基于位图的上下文,可以使用 CoreGraphics 的函数或使用 - drawInRect:
for UIImage
、-drawInRect:withFont:
forNSString
等方法来操作。对于 CoreGraphics 的绘图,一切都很清楚 - 您将一个 CGContextRef 参数传递给每个函数,但 UIKit 绘图方法使用堆栈中的当前上下文。在iOS 4.0 中的新增功能的发行说明中写道
在 UIKit 中绘制到图形上下文现在是线程安全的。具体来说:
- 用于访问和操作图形
上下文的例程现在可以正确处理驻留在不同线程上的上下文。
- 字符串和图像绘制现在是线程安全的。
- 现在可以安全地在多个线程中使用颜色和字体对象。
到现在为止还挺好。有趣的部分是我有一个项目,我在其中做一些密集的绘图并通过创建上下文来创建多个图像UIGraphicsBeginImageContextWithOptions
,但是当这些操作碰巧更耗时并且我只是将绘图移动到后台线程中并准备好显示时它们在屏幕上带有一些动画,一切正常 - 没有崩溃,没有泄漏。图像按预期绘制,似乎UIGraphicsBeginImageContextWithOptions
为后台线程创建了一个上下文,一切似乎都很好。
所以我的问题是:
- 为什么UIGraphicsBeginImageContextWithOptions
只需要在主线程上调用,因为它似乎在后台运行良好?-
如何使用UIImage
-drawInRect:
方法例如,在后台线程中,我没有当前上下文并且我似乎无法创建一个,因为我不能UIGraphicsBeginImageContextWithOptions
在那里调用?
- 使用 UIKit 的方法处理背景图像的正确方法是什么(我知道我也可以使用CGBitmapContextCreate
,但它既不会将创建的上下文推送到上下文堆栈中,我似乎也无法自己完成以使用-drawInRect:
方法UIImage
)?