这个核心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 。 从后台线程的view.layer调用renderInContext是否安全? 或者一般来说,从另一个线程读取一个UIKit对象是否安全?

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

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

核心graphics和核心animation是低级的API,通常是线程安全的。 但是,关于访问的相同规则仍然适用:任何工作都不能同时被多个线程访问,否则绘图将失败,您的应用程序将崩溃。 我会对UIImage保持警惕(但不要害怕),因为UIKit对象不仅不是线程安全的,而且基本上都是在后台线程中滴答时间炸弹,并且会很乐意直接跳下悬崖,进入Exception Land。 但是,因为UIImage只是一个CGImage包装,所以大多数绘图是线程安全的。