这个Core Graphics代码线程安全吗?

时间:2012-07-06 04:22:41

标签: iphone objective-c ios core-graphics

我知道只要我打电话

就可以安全地使用任何线程
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,它位于主线程上。从后台线程调用renderInContext上的view.layer是否安全?或者一般来说,从另一个线程读取UIKit对象是否安全?

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

(上面的代码工作正常,但我不确定这是不是巧合。)

1 个答案:

答案 0 :(得分:7)

核心图形和核心动画是低级API,通常是线程安全的。但是,关于访问的相同规则仍然适用:任何工作都不能同时被多个线程访问,否则绘图将失败,您的应用程序将崩溃。我会对UIImage保持警惕(但并不害怕),因为UIKit对象不仅不是线程安全的,它们基本上是在背景线中滴定时间炸弹,并且很乐意直接从悬崖上潜入Exception Land,这是没有充分理由的。但是,因为UIImage只是一个CGImage包装器,所以大多数绘图都是线程安全的。