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

Sno*_*man 7 iphone core-graphics objective-c ios

只要我打电话,我知道在任何线程上绘制都是安全的

UIGraphicsBeginImageContextWithOptions(view.bounds.size, view.opaque, 0.0);
UIGraphicsEndImageContext();
Run Code Online (Sandbox Code Playgroud)

在同一个线程上.

通过这种方法截取视图的截图大约需要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();
    });
Run Code Online (Sandbox Code Playgroud)

这里唯一有问题的是view,它位于主线程上.从后台线程调用renderInContexta 是否安全view.layer?或者一般来说,从另一个线程读取UIKit对象是否安全?

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

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

Cod*_*aFi 7

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

  • 是的,完全有可能,就像你自己看到的那样,并且是安全的.上帝,我希望苹果只会咬紧牙关,让UIKit线程安全,所以我们不必在第一时间进行这些讨论......好吧,也许在iOS 7中,嗯? (3认同)