在iPhone上进行线程绘图

3

苹果的文档指出,通常情况下Quartz2D是线程安全的。然而,在NSOperation期间向图像上下文绘制时,我遇到了崩溃(EXC_BAD_ACCESS)。

这是我的当前设置:

UIGraphicsBeginImageContext(imageSize);
CGContextRef context = UIGraphicsGetCurrentContext();
// drawing code
UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();

我怀疑崩溃与当前上下文有关,因为UIGraphicsGetCurrentContext文档说明需要从主线程调用。这是正确的吗?还有其他获取图像上下文的方法吗?

1
不,这是不正确的。文档决定为了纯粹的乐趣而欺骗你。 - Mike Abdullah
2个回答

4
各种UIGraphics函数大多只是低级函数周围的便利方法。阅读CGGraphicsContext以及如何创建自己的文档非常有帮助。

3

你已经回答了自己的问题。文档中说必须在主线程上调用UIGraphicsGetCurrentContext(),而你没有这样做,因此你的应用程序崩溃了。QED。


谢谢你的回答。正确的做法是什么?我目前正在研究CGBitmapContextCreate。 - Markus Müller-Simhofer
正确的做法是将UIGraphicsGetCurrentContext分解为一个单独的调用,您可以在主线程上运行,并将图形上下文存储到类变量中,其他线程将在创建返回时使用它。 - Kendall Helmstetter Gelner
@Kendall-Helmstetter-Gelner 那将是一个极其糟糕的想法。这个API根本就不是为后台线程设计的。你的建议会留下一些非常棘手的竞争条件。 - Mike Abdullah
抱歉没能及时回答这个问题。我现在正在使用CGBitmapContextCreate,它似乎已经为我解决了这个问题。不确定为什么我之前没有发现这个函数。可能是我在寻找错误的东西。感谢大家的回答! - Markus Müller-Simhofer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接