我正在屏幕外使用CGContext
创建CGBitmapContextCreate
,然后使用CGImage
从CGBitmapContextCreateImage
生成drawRect
并将其绘制到我{{1}的视图中(我还在绘制其他一些东西 - 这是一种隔离不同级别的可变性和复杂性的练习)。
当它在主线程上运行时,一切正常。然而,以这种方式分割出来的动机之一是,可以在后台线程上运行屏幕外部分(我认为它应该没问题,因为它不会渲染到屏幕上下文)。
但是,当我这样做时,生成的图像是空的!我检查了代码,并放置了明智的NSLog来验证一切都按照正确的顺序进行。
我的下一步是将这个问题归结为最简单的代码来重现问题(或者找到一些我错过的愚蠢的东西并修复它) - 此时我会有一些代码在必要时发布在这里。但我首先要在这里检查一下,我不会走错路。我在googlesphere周围的旅行中找不到任何可以解决问题的事情 - 但是朋友确实提到他在尝试在后台线程中调整图像大小时遇到了类似的问题 - 这表明这里可能有一些普遍的限制。 / p>
[编辑]
感谢目前为止的回复。如果没有别的,他们告诉我,至少我并不是唯一一个没有答案的人 - 这是我想要找到的一部分。在这一点上,我将把额外的工作放在获得最简单的可能示例上,并且可能会返回一些代码或更多信息。在此期间,请保留任何想法: - )
提出一点:有几个人使用了关于API的术语线程安全。应该注意的是,在这种情况下有两种类型的线程安全性:
我怀疑到目前为止提到的是第一种类型,但如果您能澄清,我将不胜感激。
[edit2 - solve!]
好的,我把它全部搞定了。执行摘要是问题出在我身上,而不是位图上下文本身。
在我的后台线程中,就在我进入位图上下文之前,我正在对其他一些对象做一些准备。事实证明,间接地调用那些导致在某些视图上调用setNeedsDisplay的其他对象! 通过将完成该部分的部分分离到主线程,它现在都可以完美地工作。
因此,对于那些遇到这个问题的人,想知道他们是否可以在后台线程上绘制位图上下文,答案就是你可以(在这里和答案中提出的警告)。
全部谢谢
答案 0 :(得分:3)
只是一个猜测,但是如果你试图从另一个线程调用setNeedsDisplay,你需要通过performSelectorOnMainThread来调用它。
答案 1 :(得分:2)
如果您在一个且只有一个线程中使用CGContextRef,那么您正在做的事情应该有用。我之前已经完成了这项工作,其中8个核心处理图像的8个不同部分,然后将不同的结果CGImageRefs合成在一起并在屏幕上绘制。
答案 2 :(得分:1)
那就是说,你的经历意味着存在问题。可能是你在渲染之前使用你的图像吗?
答案 3 :(得分:0)
并非所有API都是线程安全的。有些需要锁定或要求它们在主线程上运行。您可能想要搜索文档。我相信有一个页面总结了SDK的哪些部分是线程安全的,哪些不是。
答案 4 :(得分:0)
如果有人正在/正在寻找如何做到这一点,我写了blog post来描述如何做到这一点,并将整个事情包装在NSOperation子类中。