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