UIGraphicsBeginImageContextWithOptions和multithreading

我对UIGraphicsBeginImageContextWithOptions和线程有点困惑,因为根据UIKit函数参考 UIGraphicsBeginImageContextWithOptions只能在主线程上调用。 当被调用的时候,它会创build一个基于位图的上下文,这个上下文可以用CoreGraphics的函数或者像drawInRect: for UIImage-drawInRect:withFont: for NSString等方法来处理。 对于CoreGraphics的绘图,一切都很清楚 – 你将一个CGContextRefparameter passing给每个函数,但UIKit绘图方法使用栈中的当前上下文。 在iOS 4.0新增function的发行说明中写道

在UIKit中绘制graphics上下文现在是线程安全的。 特别:
– 用于访问和操作graphics的例程
上下文现在可以正确处理驻留在不同线程上的上下文。
– string和图像绘制现在是线程安全的。
– 在多个线程中使用颜色和字体对象现在是安全的。

到现在为止还挺好。 有趣的部分是我有一个项目,在那里我通过创buildUIGraphicsBeginImageContextWithOptions上下文创build了多个图像,并创build了多个图像,但是当这些操作碰巧比较费时,我只是在后台线程中移动绘图,一些animation显示在屏幕上,一切正常 – 没有崩溃,没有泄漏。 图像绘制,因为它们是预期的,它似乎UIGraphicsBeginImageContextWithOptions为后台线程创build一个上下文,一切似乎都很好。
所以我的问题是:
– 为什么有必要只调用UIGraphicsBeginImageContextWithOptions在主线程,因为它似乎在后台工作正常?
– 如何使用UIImage-drawInRect:方法在后台线程中,我没有当前的上下文,我似乎无法创build一个,因为我不能在那里调用UIGraphicsBeginImageContextWithOptions
– 什么是正确的方法来使用UIKit的方法背景image processing(我知道我也可以使用CGBitmapContextCreate ,但它既不推动创build的上下文到上下文堆栈,我似乎也能够做到这一点,以便使用-drawInRect: UIImage方法)?

所以,经过几天的调查,如何操纵UIKit上下文是线程安全的,但是你似乎不能在除了main之外的线程中创build一个,因为UIGraphicsBeginImageContextWithOptions “只能在main线程“,但仍然做得很好,在阅读了一些关于这个主题的小post后,与苹果的开发者论坛上的其他人讨论了这个问题,我可以清楚地说明,在UIGraphicsBeginImageContextWithOptionsUIGraphicsPushContextUIGraphicsPopContext的文档中说的是错误的 ,可以调用方法,而在另一个线程中使用的上下文没有问题。 所以UIGraphicsBeginImageContextWithOptionsUIGraphicsPushContextUIGraphicsPopContext线程安全的

部分答案:使用UIGraphicsPushContext将自己的CG上下文推送到“UIKit上下文”堆栈的顶部,并且所有的东西(从我的解释苹果文档的该线程)都将绘制到这个。 不要忘记使用UIGraphicsPopContext从UIKit上下文栈中popup它。

这适用于所有的UIKit绘图操作; 例如绘制UIImage ,就像你问的那样。 推一个上下文,绘制,然后popup上下文。