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になるのは、メイン スレッドにある だけです。バックグラウンド スレッドから呼び出しrenderInContextても安全ですか? view.layerまたは一般的に、別のスレッドから UIKit オブジェクトを読み取り専用にしても安全ですか?

(そして、デフォルトの「UIKitはスレッドセーフではありません」という回答を私に与えないでください。私はすでにそれを知っています。これは特別なケースです(特別なケースがないとは言わないでください)。)

(上記のコードは正常に動作しますが、それが単なる偶然かどうかはわかりません。)

4

1 に答える 1

7

Core Graphics と Core Animation は低レベル API であり、一般にスレッド セーフです。ただし、アクセスに関する同じルールが引き続き適用されます。どの作業も、同時に複数のスレッドからアクセスしてはなりません。そうしないと、描画が失敗し、アプリがクラッシュします。UIKitオブジェクトはスレッドセーフではないだけでなく、基本的にバックグラウンドスレッドで時限爆弾を刻んでおり、正当な理由もなく崖から例外土地に喜んで飛び込むため、UIImageには警戒します(しかし恐れません)。ただし、UIImage は単なる CGImage ラッパーであるため、ほとんどの描画はスレッド セーフです。

于 2012-07-06T04:35:30.300 に答える