ios – UIGraphicsBeginImageContextWithOptions和多线程

我对UIGraphicsBegin ImageContextWithOptions和线程有点困惑,因为根据 UIKit Function Reference UIGraphicsBeginImageContextWithOptions应该只在主线程上调用.当被调用时,它创建一个基于位图的上下文,可以使用CoreGraphics的函数或者像-drawInRect这样的方法来处理:对于UIImage,-drawInRect:withFont:for Nsstring等等.对于CoreGraphics的绘图,一切都很清楚 – 你传递一个CGContextRef参数被操纵到每个函数,但UIKit绘图方法使用堆栈中的当前上下文.在 What’s New in iOS 4.0的发行说明中写道

Drawing to a graphics context in UIKit is Now thread-safe. Specifically:
– The routines used to access and manipulate the graphics
context can Now correctly handle contexts residing on different
threads.
– String and image drawing is Now thread-safe.
– Using color and
font objects in multiple threads is Now safe to do.

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

解决方法

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

相关文章

UITabBarController 是 iOS 中用于管理和显示选项卡界面的一...
UITableView的重用机制避免了频繁创建和销毁单元格的开销,使...
Objective-C中,类的实例变量(instance variables)和属性(...
从内存管理的角度来看,block可以作为方法的传入参数是因为b...
WKWebView 是 iOS 开发中用于显示网页内容的组件,它是在 iO...
OC中常用的多线程编程技术: 1. NSThread NSThread是Objecti...