UIKit Function ReferenceUIGraphicsBeginImageContextWithOptions
によると、私はちょっとだけUIGraphicsBeginImageContextWithOptions
とスレッドについて混乱しています。呼び出されると、ビットマップベースのコンテキストが作成されます。CoreGraphicsの関数またはdrawInRect:
の場合はUIImage
、-drawInRect:withFont:
の場合はNSString
のように操作できます。 CoreGraphicsの描画ではすべてが明確です。すべての関数に操作されているCGContextRef引数を渡しますが、UIKit描画メソッドはスタック内の現在のコンテキストを使用します。 What's New in iOS 4.0のリリースノートでは、UIKitのグラフィックスコンテキストに描画UIGraphicsBeginImageContextWithOptionsWithOptionsWithOptionsとマルチスレッド
は今、スレッドセーフであると書かれています。具体的には
グラフィックスにアクセスして操作するためのルーチン
コンテキストは異なる スレッドに存在するコンテキストを正しく処理できるようになりました。
- 文字列とイメージの描画がスレッドセーフです。
- 複数のスレッドにカラーオブジェクトと フォントオブジェクトを使用することは、今や安全です。
これまでのところとても良いです。興味深いのは、私が集中的な図面を作成し、UIGraphicsBeginImageContextWithOptions
でコンテキストを作成して複数の画像を作成するプロジェクトがあることです。しかし、これらの操作に時間がかかり、バックグラウンドスレッドで描画を移動したばかりで、いくつかのアニメーションでそれらを画面に表示すると、すべて正常に動作します。クラッシュやリークはありません。画像は期待通りに描画され、UIGraphicsBeginImageContextWithOptions
はバックグラウンドスレッドのコンテキストを作成しているようですが、すべて正常であるようです。
私の質問は次のとおりです:
- バックグラウンドで正常に動作しているように見えるので、メインスレッドでUIGraphicsBeginImageContextWithOptions
を呼び出す必要があるのはなぜですか?
- メソッドを使用して、現在のコンテキストがないバックグラウンドスレッドなどで、UIGraphicsBeginImageContextWithOptions
を呼び出すことができないため、作成できないようです。
- UIKitのメソッドを使用した背景画像操作の正しいアプローチは何ですか(私はCGBitmapContextCreate
を使用することもできますが、作成したコンテキストをコンテキストスタックにプッシュすることも、自分自身で行うこともできません)-drawInRect:
メソッドUIImage
)?
...見て、私の質問に答えました。これは、iOS5 SDK以前のドキュメントエラーです(WWDC 2012ビデオにアクセスしている場合は、セッション211とiOS6 SDKドキュメントをチェックしてください)。 –
また、UIGraphicsEndImageContext()を呼び出すことが非常に重要です。または、CPUでうんざりするようなことが始まります。 – bentford
ドキュメントは修正されました: 'iOS 4以降では、あなたのアプリのスレッドからこの関数を呼び出すことができます。 – graver