在UI线程中绘制的CALayer.contents?

时间:2011-08-11 17:00:26

标签: ios core-animation calayer

您能否确认在后台线程中使用CGImageRef设置CALayer.contents属性仍然使核心动画在主线程循环(即UI线程)中绘制内容图像,而不是核心动画线程或自定义后台线程设置内容属性?

我之所以问这个问题,核心动画会运行自己的线程,但是,当您设置CALayer.contents属性时,UI线程会将绘图用于图层吗?

1 个答案:

答案 0 :(得分:2)

我的经验是,如果你有一个可见的图层并在后台线程中设置内容,很可能不会立即绘制。我使用的解决方案是使用主线程上的dispatch_async()调用异步设置contents属性:

dispatch_async(dispatch_get_main_queue(), ^(void) {
    layer.contents = (id)myCGImage;
});

特别是,我的示例是使用GCD处理线程,其中线程本身可能比您正在运行的操作长得多。在这种情况下,将赋值放在主线程上,或强制[CATransaction flush]是向OS指示您希望将数据呈现给用户的两种方法。

否则,在GCD后台线程的情况下,你受到线程运行循环的支配,这可能不会长时间执行[CATransaction flush](根据我的经验,秒数)。