更新:この問題はここでも報告されており、原因のより詳細な処理が含まれています。
UIImageWriteToSavedPhotosAlbumは、10個のうち5個の画像のみを保存します。なぜですか。
私の場合も、エラーは「書き込みビジー」でした。これは、デバイスの速度に関連する問題のようです。おそらく、スレッドなどを手動で処理することを含むいくつかの解決策がありますが、以下のTommyの回答に触発されて、画像の保存をシリアル化し、問題を回避します。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
状況:
forループを使用して大量の画像のコレクションをカメラロールに保存しようとしています(画像の数はユーザー入力によって異なります。理論的には数百になります)。画像はNSSet
(私も同じように簡単に実行できますがNSArray
)によってポイントされ、forループが完了した後ににNSSet
設定されます。nil
私は(のクラスメソッドUIImageWriteToSavedPhotosAlbum()
を使用して)切り離されたスレッドに画像を保存するために使用しており、メインスレッドでスピナーを起動しています。NSThread
detachNewThreadSelector:toTarget:withObject:
UIActivityIndicator
問題:
〜5を超えて保存しようとすると、〜5日以降の画像は、次のエラーをログに出力します。
*** -[NSKeyedUnarchiver initForReadingWithData:]: data is NULL
たとえば、9枚の画像をエクスポートしたとします。forループは9つの画像すべてを実行します(NSLoggingによって確認されます)が、上記のエラーが約4回繰り返されます(カメラロールに保存される画像は5つだけです)。
ただし、ループにブレークポイントを追加し、各反復の間に1〜2秒待つと、問題なくすべて正しく保存されます。それで..
仮説:
私のログと観察に基づくと、UIImageWriteToSavedPhotosAlbum()
明らかに非同期で実行されており、アプリケーションに追いつくにはどういうわけか「遅すぎる」。
同期的に(理想的にはメインスレッドで)実行するように強制する簡単な方法はありますか?保存しようとしている画像に参照カウントを追加することを試みてきましたが、(1)これはハッキーだと感じ、(2)それでも問題を解決できませんでした。
どんなアドバイスも素晴らしいでしょう。ありがとう!