12

UIKit 関数参照によると、メインスレッドでのみ呼び出す必要があるUIGraphicsBeginImageContextWithOptionsため、スレッド化について少し混乱しています。呼び出されるとビットマップ ベースのコンテキストが作成され、CoreGraphics の関数またはfor 、forなどのメソッドを使用して操作できるようになります。CoreGraphics の描画ではすべてが明確です。すべての関数に操作される CGContextRef 引数を渡しますが、UIKit 描画メソッドはスタック内の現在のコンテキストを使用します。What's New in iOS 4.0 のリリース ノートには、次のように書かれています。 UIGraphicsBeginImageContextWithOptionsdrawInRect:UIImage-drawInRect:withFont:NSString

UIKit でのグラフィックス コンテキストへの描画がスレッドセーフになりました。具体的には:
- グラフィック コンテキストへのアクセスと操作に使用されるルーチンは
、異なるスレッドに存在するコンテキストを正しく処理できるようになりました。
- 文字列と画像の描画がスレッドセーフになりました。
- 複数のスレッドで色とフォントのオブジェクトを安全に使用できるようになりました。

ここまでは順調ですね。興味深い部分は、集中的な描画を行いUIGraphicsBeginImageContextWithOptions、コンテキストを作成して複数の画像を作成するプロジェクトがあることですが、これらの操作に時間がかかり、描画をバックグラウンド スレッドに移動し、準備ができたら表示します。それらはいくつかのアニメーションで画面に表示され、すべてが正常に機能します-クラッシュもリークもありません. 画像は期待どおりに描画されUIGraphicsBeginImageContextWithOptions、バックグラウンド スレッドのコンテキストが作成され、すべて問題ないようです。
だから私の質問は次のとおりです: -バックグラウンドで正常に動作しているように見えるのに、メインスレッドでのみ
呼び出す必要があるのはなぜですか? -の 使い方UIGraphicsBeginImageContextWithOptions
UIImage-drawInRect:たとえば、現在のコンテキストがなく、そこで呼び出すことができないため作成できないように見えるバックグラウンド スレッドでのメソッドUIGraphicsBeginImageContextWithOptionsですか?
- UIKit のメソッドを使用した背景画像操作の正しいアプローチは何CGBitmapContextCreateですか?-drawInRect:UIImage

4

2 に答える 2

27

したがって、数日間の調査の後、UIKit コンテキストの操作はスレッドセーフであるにもかかわらず、UIGraphicsBeginImageContextWithOptions「メイン スレッドでのみ呼び出す必要があるため、メイン以外のスレッドで作成できないようです」 "、しかし、それでも問題なく動作し、この件に関するいくつかの小さな投稿を読んで、Apple の開発者フォーラムで他の人と議論した後、ドキュメントで述べられていることは間違いUIGraphicsBeginImageContextWithOptionsUIGraphicsPushContextあり、それらのメソッドは呼び出される可能性があることを明確に述べることができます。問題なく別のスレッドで使用されるコンテキスト。とはスレッドセーフです。UIGraphicsPopContextUIGraphicsBeginImageContextWithOptionsUIGraphicsPushContextUIGraphicsPopContext

于 2012-06-08T18:39:23.507 に答える
0

部分的な回答:UIGraphicsPushContext独自の CG コンテキストを「UIKit コンテキスト」スタックの一番上にプッシュするために使用すると、すべて (Apple のドキュメントを解釈すると、そのスレッドから) がそれに描画されます。UIGraphicsPopContextを使用して UIKit コンテキスト スタックからポップすることを忘れないでください。

これは、すべての UIKit 描画操作に適用されます。たとえばUIImage、あなたが尋ねたように、s を描画します。コンテキストをプッシュし、描画してから、コンテキストをポップします。

于 2012-06-07T12:21:49.950 に答える