UIGraphicsBeginImageContextWithOptions和Multithreading

gra*_*ver 10 multithreading core-graphics uikit ios

我有点困惑UIGraphicsBeginImageContextWithOptions和线程,因为根据UIKit函数引用 UIGraphicsBeginImageContextWithOptions应该只在主线程上调用.调用时,它会创建一个基于位图的上下文,可以使用CoreGraphics的函数或者像drawInRect:for UIImage,-drawInRect:withFont:for NSString等等方法进行操作.对于CoreGraphics的绘图,一切都很清楚 - 您传递了一个CGContextRef参数,该参数被操作到每个函数,但UIKit绘图方法使用堆栈中的当前上下文.在iOS 4.0的新功能的发行说明中写道

在UIKit中绘制图形上下文现在是线程安全的.具体来说:
- 用于访问和操作图形
上下文的例程现在可以正确处理驻留在不同线程上的上下文.
- 字符串和图像绘制现在是线程安全的.
- 现在可以安全地使用多个线程中的颜色和字体对象.

到现在为止还挺好.有趣的是我有一个项目,在那里我做一些密集的绘图并通过创建上下文来创建多个图像UIGraphicsBeginImageContextWithOptions,但是当这些操作碰巧更耗时并且我只是在后台线程中移动绘图并且在准备好显示时他们在屏幕上有一些动画,一切都很好 - 没有崩溃,没有泄漏.图像按预期绘制,似乎UIGraphicsBeginImageContextWithOptions为后台线程创建了一个上下文,一切似乎都很好.
所以我的问题是:
- 为什么有必要UIGraphicsBeginImageContextWithOptions只调用主线程,因为它似乎在后台工作正常?
- 如何使用UIImage-drawInRect:方法,例如,在后台线程中,我没有当前上下文,我似乎无法创建一个因为我不能UIGraphicsBeginImageContextWithOptions在那里调用?
- 使用UIKit方法进行背景图像处理的正确方法是什么(我知道我也可以使用CGBitmapContextCreate,但它既不会将创建的上下文推送到上下文堆栈中,也不能自己为了使用-drawInRect:方法而自行完成UIImage)?

gra*_*ver 24

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

  • 文档已修复:`在iOS 4及更高版本中,您可以从应用程序的任何线程调用此函数 (4认同)
  • 我可以证实这一点.这是iOS5 SDK及更早版本中的文档错误(如果您可以访问WWDC 2012视频,请查看会话211和iOS6 SDK文档). (3认同)