12

我对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)?

4

2 回答 2

27

因此,经过几天的调查,如何操作 UIKit 上下文是线程安全的,但您似乎无法在主线程以外的线程中创建一个,因为UIGraphicsBeginImageContextWithOptions“应该只在主线程上调用”,但是这样做仍然非常有效,并且在阅读了有关该主题的一些小帖子并与 Apple 开发者论坛上的其他人讨论之后,我可以清楚地说明,文档中所说的关于UIGraphicsBeginImageContextWithOptionsUIGraphicsPushContext并且UIGraphicsPopContext错误的,并且可以调用这些方法并且在另一个线程中使用的上下文没有问题。所以UIGraphicsBeginImageContextWithOptions和是线程安全UIGraphicsPushContext的。UIGraphicsPopContext

于 2012-06-08T18:39:23.507 回答
0

部分答案:UIGraphicsPushContext用于将您自己的 CG 上下文推送到“UIKit 上下文”堆栈的顶部,并且所有内容(来自该线程,正如我解释 Apple 的文档)将绘制到那个。不要忘记使用UIGraphicsPopContext从 UIKit 上下文堆栈中弹出它。

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

于 2012-06-07T12:21:49.950 回答