2

私はUIImagePickerControllerを使用して静止画像をキャプチャしています。次に、画像の異なるコピーをCore Dataストアに保存する前に、いくつかの処理作業を行う必要があります。処理と保存の作業はiPhone 4で4〜8秒かかることがあるので、バックグラウンドキューに作業を分けて、アプリ全体とUIがブロックされないようにしています。バックグラウンド処理のためにUIImagePickerControllerから画像データを渡す

私の質問の根源はこれです。 UIImageオブジェクトが完全にそのスレッドに限定されている限り、バックグラウンドスレッドでUIImageを使用できますか?私はapple's thread safety summaryでNSImageについて次のように見つけました。私はUIImageが同じように動作すると仮定しています。

NSImageでは制限:

1つのスレッドは、NSImageではオブジェクトを作成し、画像バッファに描画し、描画のためにメインスレッドにそれを渡すことができます。基礎となるイメージキャッシュはすべてのスレッドで共有されます。イメージとキャッシングの仕組みの詳細については、「Cocoa Drawing Guide」を参照してください。

誰でもこれを確認することができますか、メインスレッドの外側のUIImageオブジェクトのようなものに触れることは間違っていますか?限られたUIImageインスタンスを使用している場合は、別の問題が発生します。 UIImagePickerControllerはスレッドセーフであるNSDictionaryを返しますが、その中でNSDictionaryはUIImageオブジェクトです。その辞書を別のスレッドに渡してから、そのスレッド内のオブジェクトを使用するのは安全ですか?

imagePicker情報辞書のUIImageを使用するのが安全でない場合は、どのように処理するのが良いかに関する提案はありますか?

実際のコアデータスレッドの問題がわかったと思います。しかし、私は現在、NSValueTransformerを使ってイメージデータを書き込み、取得し、カスタムNSManagedObjectサブクラス内のNSDataとの間でUIImageを変換します。

答えて

0

「UIImagePickerControllerの後の画像を処理する」コードは、あなたの問題と同じようにバックグラウンドスレッドで処理されました。以下は私が成功したステップです。

  1. イメージピッカー代理人がユーザーのイメージを返します。バックグラウンドスレッドクラスへ
  2. 割り当て画像
  3. 近い/
  4. バックグラウンド処理が続行され、元
  5. を操作した後に、新しいUIImageを作成し、イメージピッカーを却下(私の場合、それは@propertyはIVARをretain'edでした)新しいUIImageが適切なVCに返されます
  6. バックグラウンドプロセスが終了します。
+0

お返事ありがとうございます。それは働いているようだ。私は前に試してみましたが、UIImageを渡すことができませんでした。私は、保持プロパティの代わりにコピーを使用している可能性があります。 –

関連する問題