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