我知道只要我打电话
就可以安全地使用任何线程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不是线程安全的”答案。我已经知道了。这是一个特例(不要告诉我没有特殊情况)。)
(上面的代码工作正常,但我不确定这是不是巧合。)
答案 0 :(得分:7)
核心图形和核心动画是低级API,通常是线程安全的。但是,关于访问的相同规则仍然适用:任何工作都不能同时被多个线程访问,否则绘图将失败,您的应用程序将崩溃。我会对UIImage保持警惕(但并不害怕),因为UIKit对象不仅不是线程安全的,它们基本上是在背景线中滴定时间炸弹,并且很乐意直接从悬崖上潜入Exception Land,这是没有充分理由的。但是,因为UIImage只是一个CGImage包装器,所以大多数绘图都是线程安全的。