这是核芯显卡的代码线程安全的?(Is this Core Graphics code thread

2019-06-26 02:15发布

我知道它是安全的,只要我呼吁任何线程画

UIGraphicsBeginImageContextWithOptions(view.bounds.size, view.opaque, 0.0);
UIGraphicsEndImageContext();

在同一个线程。

以一个视图的屏幕截图通过此方法需要大约300毫秒,这是不坏,但我在紧张的情况,所以我想这样做在后台线程。

下面是我在做什么:

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
        UIGraphicsBeginImageContextWithOptions(view.bounds.size, view.opaque, 0.0);
        [view.layer renderInContext:UIGraphicsGetCurrentContext()];
        UIImage * screenshot = UIGraphicsGetImageFromCurrentImageContext();
        UIGraphicsEndImageContext();
    });

这里所讨论的唯一的事情是view ,它位于主线程。 它是安全的呼吁renderInContextview.layer从后台线程? 或者一般,是安全的只读从另一个线程的UIKit对象的?

(请不要给我默认“的UIKit不是线程安全”的答案。我已经知道了,这这里是一个特殊的情况下(不要告诉我,有没有特殊的情况下)。)

(上面的代码工作正常,但我不知道,如果这只是一个巧合。)

Answer 1:

核芯显卡和核心动画是低级别的API,通常是线程安全的。 但是,关于访问相同的规则仍然适用:任何工作不能由多个线程同时访问,否则绘制将失败,您的应用程序会崩溃。 我会的UIImage的警惕(但不害怕),因为UIKit的对象不只是不是线程安全的,他们基本上不定时炸弹在后台线程,并愉快地潜水直悬崖到异常的土地没有充分的理由。 然而,由于UIImage的只是一个CGImage包装,再次,大多数绘图是线程安全的。



文章来源: Is this Core Graphics code thread safe?