我正在屏幕上绘制一个CGContext
创建的使用CGBitmapContextCreate
,然后CGImage
从中生成一个CGBitmapContextCreateImage
并将其绘制到我的视图中drawRect
(我还在绘制其他一些东西 - 这是一种隔离不同级别的可变性和复杂性的练习).
当它全部在主线程上运行时,一切正常.然而,通过这种方式将其拆分的动机之一就是使得屏幕外部分可以在后台线程上运行(我认为它应该没问题,因为它不会渲染到屏幕上下文).
但是,当我这样做时,生成的图像是空的!我检查了代码,并放置了明智的NSLog来验证一切都按正确的顺序发生.
我的下一步是将其归结为最简单的代码,以重现问题(或者找到一些我遗漏的傻事并修复它) - 此时我会在必要时在此处发布一些代码.但我首先要在这里检查一下,我不会走错路.我在googlesphere周围的旅行中找不到任何可以解决问题的东西 - 但是朋友确实提到他在尝试在后台线程中调整图像大小时遇到了类似的问题 - 这表明这里可能存在一些普遍的限制.
[编辑]
感谢到目前为止的回复.如果没有别的,他们告诉我,至少我并不是唯一一个没有答案的人 - 这是我想要找到的一部分.在这一点上,我将把额外的工作放在获得最简单的可能示例上,并且可能会返回一些代码或更多信息.在此期间保持任何想法:-)
提出一点:有几个人在API方面使用了术语线程安全.应该注意的是,在这种情况下有两种类型的线程安全:
API本身的可线性 - 即它可以在多个线程中使用它(全局状态和其他重入问题,例如C的strtok是API可能也不是线程安全的常见原因).
单个操作的原子性 - 多个线程可以通过API与相同的对象和资源进行交互而无需应用程序级锁定吗?
我怀疑到目前为止提到的是第一种类型,但如果你能澄清,我将不胜感激.
[edit2 - 解决了!]
好的,我把它全部搞定了.执行摘要是问题出在我身上,而不是位图上下文本身.
在我的后台线程中,就在我进入位图上下文之前,我正在对其他一些对象做一些准备.事实证明,间接地调用那些导致在某些视图上调用setNeedsDisplay的其他对象!通过将完成该部分的部分分离到主线程,它现在完全可以正常工作.
所以对于那些遇到这个问题的人来说,想知道他们是否可以在后台线程上绘制位图上下文,答案就是你可以(在这里和答案中提出的警告).
谢谢大家