9

CGContextを使用して作成されたものにオフスクリーンで描画しCGBitmapContextCreate、後でそれを使用してを生成し、CGImageそれをCGBitmapContextCreateImageビューに描画しますdrawRect(その上に他のものも描画しています-これは、さまざまなレベルの変動性と複雑さを分離するための演習です)。

これはすべてメインスレッドで実行されている場合は正常に機能します。ただし、これをこのように分割する動機の1つは、オフスクリーン部分をバックグラウンドスレッドで実行できるようにすることでした(オンスクリーンコンテキストにレンダリングされないため、問題ないと思っていました)。

ただし、これを行うと、結果の画像は空になります。コードをチェックし、賢明なNSLogを配置して、すべてが正しい順序で行われていることを確認しました。

私の次のステップは、これを問題を再現する最も単純なコードに要約することです(または、不足している愚かなものを見つけて修正します)。その時点で、必要に応じてここに投稿するコードがあります。しかし、私は最初に、これで間違った道を進んでいないことをここで確認したかったのです。どちらの方法でも光を当てるグーグルスフィアの旅では何も見つかりませんでしたが、友人は、バックグラウンドスレッドで画像のサイズを変更しようとしたときに同様の問題が発生したと述べました。これは、ここに一般的な制限がある可能性があることを示唆しています。

[編集]

これまでの回答ありがとうございます。他に何もなければ、少なくとも私はこれに対する答えを持っていないのは私だけではない、と彼らは私に言った-それは私が知りたかったことの一部だった。この時点で、可能な限り単純な例を取得するために追加の作業を行い、コードまたは詳細情報が返される可能性があります。それまでの間、アイデアは今後も続けてください:-)

提起する1つのポイント: APIに関してスレッドセーフという用語を使用している人が何人かいます。このコンテキストでは、スレッドセーフには2つのタイプがあることに注意してください。

  1. API自体のスレッド性-つまり、複数のスレッドから使​​用できます(グローバル状態や、Cのstrtokなどの他の再入可能性の問題は、APIがスレッドセーフではない可能性がある一般的な理由です)。
  2. 個々の操作の親和性-複数のスレッドが、アプリケーションレベルのロックなしで、APIを介して同じオブジェクトやリソースと対話できますか?

これまでの言及は最初のタイプだったと思いますが、明確にしていただければ幸いです。

[編集2-解決しました!]

わかりました、私はそれをすべて機能させました。エグゼクティブサマリーは、問題はビットマップコンテキスト自体ではなく、私にあるということです。

バックグラウンドスレッドでは、ビットマップコンテキストに描画する直前に、他のオブジェクトの準備を行っていました。間接的に、一部のビューでsetNeedsDisplayが呼び出されることにつながる他のオブジェクトへの呼び出しが判明しました。それを行った部分をメインスレッドに分離することで、すべてが完全に機能するようになりました。

したがって、この質問に答えて、バックグラウンドスレッドのビットマップコンテキストに描画できるかどうか疑問に思っている人にとっては、答えはあなたです(ここと回答に示されている警告を使用して)。

皆さんありがとう

4

5 に答える 5

3

推測ですが、別のスレッドから setNeedsDisplay を呼び出そうとしている場合は、代わりに performSelectorOnMainThread を介して呼び出す必要があります。

于 2009-04-01T08:30:00.980 に答える
1

Apple は iPhone でのスレッド セーフについて何も述べていませんが、Cocoa (UIKit とは対照的に) は一般的に描画に対してスレッド セーフです。多くの描画コードを共有しているため、iPhone での描画はスレッドセーフであると思います。

そうは言っても、あなたの経験は問題があることを暗示しています。レンダリングする前に画像を使用している可能性はありますか?

于 2009-04-01T08:16:23.697 に答える
0

すべての API がスレッドセーフであるとは限りません。ロックが必要なものや、メイン スレッドで実行する必要があるものもあります。ドキュメントを精査することをお勧めします。SDK のどの部分がスレッドセーフで、どの部分がそうでないかをまとめたページがあると思います。

于 2009-03-31T21:59:27.250 に答える
0

誰かがこれを行う方法を正確に探している/探していた場合に備えて、これを行う方法を説明し、すべてを NSOperation サブクラスにラップするブログ投稿を書きました。

于 2010-12-16T09:30:11.533 に答える