0

データベース オブジェクトといくつかの写真オブジェクトがあります。

データベース オブジェクトには、整数プロパティと変更可能なディクショナリ プロパティが含まれています。

整数は、新しい写真オブジェクトを作成し、変更可能なディクショナリに写真オブジェクトへのポインターが含まれているときに、変更可能なディクショナリ キーとして使用する次の空き番号を追跡します。

写真オブジェクトには、画像、画像の説明、および画像が撮影された日付が含まれます。

applicationDidBecomeActive および applicationWillResignActive メソッドがトリガーされたときに、NSKeyedUnarchiver および NSKeyedArchiver を使用して、これらのオブジェクトを読み書きしています。

そして、それはすべてうまくいっています。applicationWillResignActive がトリガーされると、NSKeyedArchiver を呼び出し、ルートとしてデータベース オブジェクトをポイントします。次に、コーダーは整数を書き出し、可変ディクショナリに遭遇すると、ディクショナリに降りて、各写真オブジェクトが呼び出されて、画像、説明、および日付であるそのプロパティを保存します。

私が言ったように、それはすべてうまくいっています。しかし、写真の数が増えるにつれて、それはますます遅くなったように感じたので、いくつかのタイミングを計りました。

アーカイブを読み込むと、書き出すよりも約 25 倍高速であることがわかりました。

そこで、書き込み側を高速化する方法として、新しい写真や変更された写真だけを書き出すというアイデアを思いつきました。結局のところ、ほとんどの写真は過去のセッションからのもので、以前から 30 ~ 50 枚の写真があり、今回は 2 ~ 3 枚の新しい写真しか撮影できない可能性があります。

写真が新しいか古いかを示すフラグをいくつか作成しました。applicationWillResignActive がトリガーされ、各 encodeWithCoder 呼び出しを処理する写真オブジェクトで自分自身がダウンしている場合、写真が新しい場合は画像、説明、日付を保存し、古い場合は保存をスキップします。

うーん、期待したほどの結果にはなりませんでした:-)

applicationWillResignActive がトリガーされると、書き出すのをスキップしたすべての写真が空の写真オブジェクトとして書き出され、同じキーで前の写真オブジェクトが上書きされます。次に、それらを再度ロードすると、bupkis、nada、zip が得られます。

最初の質問は、オブジェクト ツリーの一部だけを書き出して、書き出さなかった部分を以前の完全な書き込みからそのまま残しておくことができるかということだと思います。それはナイーブな考えではないかと思い始めています。

ガリモン

4

2 に答える 2

0

オブジェクトの配列のアーカイブを使用すると、アーカイブが大きくなるにつれて、ますます非効率的になります。これは、オブジェクトに画像が含まれているという事実によって悪化します。2つの考え:

  1. このデータを格納するためにCore Dataを使用することを検討する必要があります。(SQLite を直接使用することもできますが、Core Data は iOS で推奨されるオブジェクト永続化テクノロジです。) このように、新しいオブジェクトを保存する場合は、その新しいオブジェクトを追加するだけで、コレクション全体をアーカイブしません。毎回オブジェクトの。

  2. さらに、速度が主な関心事であり、画像が大きい場合、SQLite (Core Data がデフォルトで使用するデータベース) は、大きな BLOB (画像など) を処理するときに非効率的です。洗練されていないように聞こえるかもしれませんが、画像をDocumentsフォルダーに保存し、画像ファイルの URL またはパスのみを CoreData に保存することをお勧めします。

于 2013-08-17T16:21:00.127 に答える