Iphone 使用Core Graphics/Cocoa,可以从背景线程绘制位图上下文吗?

Iphone 使用Core Graphics/Cocoa,可以从背景线程绘制位图上下文吗?,iphone,cocoa,multithreading,core-graphics,buffering,Iphone,Cocoa,Multithreading,Core Graphics,Buffering,我在屏幕外绘制一个使用CGBitmapContextCreate创建的CGContext,然后用CGBitmapContextCreateImage从中生成一个CGImage,并将其绘制到drawRect(我还在上面画了一些其他的东西——这是一个隔离不同层次的可变性和复杂性的练习) 当它都在主线程上运行时,这一切都很好。然而,以这种方式将其拆分的动机之一是,屏幕外的部分可以在后台线程上运行(我认为这应该是可以的,因为它没有呈现到屏幕上的上下文) 但是,当我这样做时,生成的图像是空的!我已经检查了

我在屏幕外绘制一个使用
CGBitmapContextCreate
创建的
CGContext
,然后用
CGBitmapContextCreateImage
从中生成一个
CGImage
,并将其绘制到
drawRect
(我还在上面画了一些其他的东西——这是一个隔离不同层次的可变性和复杂性的练习)

当它都在主线程上运行时,这一切都很好。然而,以这种方式将其拆分的动机之一是,屏幕外的部分可以在后台线程上运行(我认为这应该是可以的,因为它没有呈现到屏幕上的上下文)

但是,当我这样做时,生成的图像是空的!我已经检查了代码,并放置了明智的NSLog以验证一切都是按正确的顺序发生的

我的下一步是将其归结为再现问题的最简单代码(或者找到我缺少的一些愚蠢的东西并修复它)-在这一点上,如果必要的话,我会在这里发布一些代码。但我首先想在这里检查一下,我没有走错这条路。我在Google Sphere的旅行中找不到任何可以发光的东西-但一位朋友确实提到,他在尝试在背景区域调整图像大小时遇到了类似的问题d-这可能有一些一般性的限制

[编辑]

感谢到目前为止的回复。如果他们没有告诉我,至少我不是唯一一个没有答案的人——这是我想找到的部分。在这一点上,我将把额外的工作投入到获取最简单的示例中,并可能带回来一些代码或更多信息。同时保留任何ide即将到来的时刻:-)

需要指出的一点是:一些人在API中使用了线程安全这一术语。应注意,在这种情况下,有两种类型的线程安全:

  • API本身的可线程性——即它可以从多个线程中使用(全局状态和其他重入问题,如C的strtok,是API可能不是线程安全的常见原因)
  • 单个操作的原子性-多个线程可以通过API与相同的对象和资源交互而不需要应用程序级锁定吗
  • 我怀疑到目前为止提到的是第一类,但如果你能澄清一下,我将不胜感激

    [edit2-已解决!]

    好的,我把一切都搞定了。执行摘要是问题出在我身上,而不是我自己

    在我的背景线程中,就在我进入位图上下文之前,我正在对其他一些对象做一些准备。事实证明,对其他对象的调用间接导致在某些视图上调用setNeedsDisplay! 通过将执行此操作的部分分离到主线程,现在一切都可以完美地工作

    因此,对于任何想知道是否可以在背景线程上绘制位图上下文的人来说,答案是你可以(这里和答案中已经给出了警告)


    谢谢大家

    并非所有API都是线程安全的。有些需要锁定,或者需要在主线程上运行。您可能需要浏览文档。我相信有一个页面总结了SDK的哪些部分是线程安全的,哪些部分不是

    如果在一个且仅在一个线程中使用CGContextRef,那么您所做的应该是可行的。我以前用过8个内核处理图像的8个不同部分,然后将不同的结果CGImageRef合成在一起并在屏幕上绘制。苹果没有提到iPhone上的线程安全,但Cocoa(与UIKit相反)是。由于他们共享很多绘图代码,我认为在iPhone上绘图是线程安全的


    也就是说,你的经验意味着存在问题。是否在渲染图像之前使用图像?

    只是猜测,但如果您试图从另一个线程调用setNeedsDisplay,则需要通过performSelectorOnMainThread调用它。

    如果有人正在/正在搜索如何执行此操作,我已经编写了一个描述如何执行此操作的示例,并将整个过程封装在NSOperation子类中。

    谢谢。但我是从主线上说的。我在另一个线程上做的唯一一件事是绘制位图上下文我将你的标记为已接受,因为它与原因最接近-即使它没有直接引导我找到它:-)不。在我的线程方法的末尾,我在主线程上设置了对另一个方法的调用,该方法反过来调用setNeedsDisplay。只有在这一点上,图像才会从位图上下文中生成,并用于绘制到视图。我在问题中没有提到这一点,但添加了iPhone标签,这在这里可能很重要,也可能不重要(罗杰·诺兰在回答中也提到了这一点),谢谢凯洛亚。我很感激你的回答,但这正是我的出发点。我希望得到更多的细节,因为我的“搜索文档”还没有得出任何明确的结论。您对问题和解决方案的详细描述帮助我找出了我自己的代码的错误。谢谢!