CGContext
を使用して作成されたものにオフスクリーンで描画しCGBitmapContextCreate
、後でそれを使用してを生成し、CGImage
それをCGBitmapContextCreateImage
ビューに描画しますdrawRect
(その上に他のものも描画しています-これは、さまざまなレベルの変動性と複雑さを分離するための演習です)。
これはすべてメインスレッドで実行されている場合は正常に機能します。ただし、これをこのように分割する動機の1つは、オフスクリーン部分をバックグラウンドスレッドで実行できるようにすることでした(オンスクリーンコンテキストにレンダリングされないため、問題ないと思っていました)。
ただし、これを行うと、結果の画像は空になります。コードをチェックし、賢明なNSLogを配置して、すべてが正しい順序で行われていることを確認しました。
私の次のステップは、これを問題を再現する最も単純なコードに要約することです(または、不足している愚かなものを見つけて修正します)。その時点で、必要に応じてここに投稿するコードがあります。しかし、私は最初に、これで間違った道を進んでいないことをここで確認したかったのです。どちらの方法でも光を当てるグーグルスフィアの旅では何も見つかりませんでしたが、友人は、バックグラウンドスレッドで画像のサイズを変更しようとしたときに同様の問題が発生したと述べました。これは、ここに一般的な制限がある可能性があることを示唆しています。
[編集]
これまでの回答ありがとうございます。他に何もなければ、少なくとも私はこれに対する答えを持っていないのは私だけではない、と彼らは私に言った-それは私が知りたかったことの一部だった。この時点で、可能な限り単純な例を取得するために追加の作業を行い、コードまたは詳細情報が返される可能性があります。それまでの間、アイデアは今後も続けてください:-)
提起する1つのポイント: APIに関してスレッドセーフという用語を使用している人が何人かいます。このコンテキストでは、スレッドセーフには2つのタイプがあることに注意してください。
- API自体のスレッド性-つまり、複数のスレッドから使用できます(グローバル状態や、Cのstrtokなどの他の再入可能性の問題は、APIがスレッドセーフではない可能性がある一般的な理由です)。
- 個々の操作の親和性-複数のスレッドが、アプリケーションレベルのロックなしで、APIを介して同じオブジェクトやリソースと対話できますか?
これまでの言及は最初のタイプだったと思いますが、明確にしていただければ幸いです。
[編集2-解決しました!]
わかりました、私はそれをすべて機能させました。エグゼクティブサマリーは、問題はビットマップコンテキスト自体ではなく、私にあるということです。
バックグラウンドスレッドでは、ビットマップコンテキストに描画する直前に、他のオブジェクトの準備を行っていました。間接的に、一部のビューでsetNeedsDisplayが呼び出されることにつながる他のオブジェクトへの呼び出しが判明しました。それを行った部分をメインスレッドに分離することで、すべてが完全に機能するようになりました。
したがって、この質問に答えて、バックグラウンドスレッドのビットマップコンテキストに描画できるかどうか疑問に思っている人にとっては、答えはあなたです(ここと回答に示されている警告を使用して)。
皆さんありがとう