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

标签 iphone objective-c ios core-graphics

我知道在任何线程上绘制都是安全的,只要我调用

UIGraphicsBeginImageContextWithOptions(view.bounds.size, view.opaque, 0.0);
UIGraphicsEndImageContext();

在同一个线程上。

通过这种方法获取 View 的屏幕截图大约需要 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 不是线程安全的”答案。我已经知道了。这是一个特例(不要告诉我没有特例)。)

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

最佳答案

Core Graphics 和 Core Animation 是低级 API,通常是线程安全的。但是,有关访问的相同规则仍然适用:任何作品都不能同时被多个线程访问,否则绘图将失败并且您的应用程序将崩溃。我会对 UIImage 保持警惕(但不害怕),因为 UIKit 对象不仅不是线程安全的,它们基本上是后台线程中的定时炸弹,并且会无缘无故地从悬崖上直接跳入 Exception Land。然而,因为 UIImage 只是一个 CGImage 包装器,所以大多数绘图都是线程安全的。

关于iphone - 这个 Core Graphics 代码线程安全吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11355787/

相关文章:

iphone - App Store 和 iTunes 连接 : Safeguarding App name before release

iphone - 从电子邮件导入文件

iphone - 从 Mac App 获取 iPhone 信息的方法

iphone - 与直接mainBundle引用相比,checkAndCreateDatabase方法的优势

ios - UITableView 单元格未删除

iphone - 使 UIViewController 中的 NSTimer 无效以避免保留周期的最佳时间

ios - 如何用swift拍照并保存到app本地

iphone - 如何在打开应用程序时将第一个 viewController 屏幕设置为默认打开屏幕

ios - 当父容器 View 约束以编程方式更改时,UINavigationController subview 不调整大小

ios - 错误ITMS:90524 UIDeviceFamily错误