0

次のコードを検討してください。

dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0ul);

 dispatch_async(queue, ^{

UIGraphicsBeginImageContext(self.bounds.size);
CGContextRef context = UIGraphicsGetCurrentContext();

//perform some drawing into this context

UIImage *viewImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();


dispatch_sync(dispatch_get_main_queue(), ^{
    self.imageView.image=viewImage;
    });
});

ルーチンの結果でオブジェクトを更新する前に、最後にメイン キューを取得する必要があるのはなぜですか? キュー内で更新しないのはなぜqueueですか?

4

1 に答える 1

3

GUI に触れるものはすべて、メイン スレッド上にある必要があります。(メイン ディスパッチ キューは、メイン スレッドで実行されることが保証されています。) Cocoa/Cocoa Touch のその部分は、スレッド セーフではありません。

Threading プログラミング ガイドの「Threads and Your User Interface」を参照してください。

...ユーザー関連のイベントを受け取り、アプリケーションのメイン スレッドからインターフェイスの更新を開始することをお勧めします。[...] Cocoa などの一部のフレームワークでは、通常、この動作が必要です...

イメージ ビューは GUI の一部であるため、メイン スレッドでのみプロパティを設定する必要があります。

たとえば、配列を更新する場合、メイン スレッドで実行する必要はありません (同時に発生する読み取りまたはその他の書き込みに注意する必要があります)。

于 2012-08-11T07:52:26.467 に答える