7

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

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,它位于主线程上。从后台线程调用renderInContexta是否安全?view.layer或者一般来说,从另一个线程只读 UIKit 对象是否安全?

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

(上面的代码运行良好,但我不确定这是否只是巧合。)

4

1 回答 1

7

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

于 2012-07-06T04:35:30.300 回答