iOS:メモリ集中オブジェクトをエンコード/デコードする最良の方法
-
27-10-2019 - |
質問
私はiOSプログラミングにかなり初めてであり、NSCODINGプロトコルを使用してメモリ集中オブジェクトをエンコードする最良の方法を決定するのに苦労しています。
私は多数のアイテムオブジェクトを持っています。各アイテムには、それに関連付けられた多数の高解像度画像があります。さらに、各アイテムはアイテムカテゴリに属し、100個のアイテムが含まれる場合があります。
私が知る限り、いくつかの異なるエンコードオプションがあります。
- ItemCategoryオブジェクト全体をエンコードします
- ItemCategoryクラスを削除し、各アイテムのItemCategoryプロパティのみを作成し、個々のアイテムオブジェクトをエンコードするだけです。
#1は無駄に高価になると思われます。新しいアイテムをItemCategoryに追加するには、ItemCategory全体をデコードする必要があります(これには、含まれているアイテムに結び付けられた数百の画像をデコードすることを意味します)、アイテムを追加してから、全体を再エンコードする必要があります。 (繰り返しますが、これらすべての画像とともに)。
しかし、#1はコード構造の観点からそれを行う正しい方法のようです。 #2は、アイテムを保存し、それぞれのアイテムカテゴリに関連付けるためのより直感的ではない方法を考え出すことを強制します。
#1を使用した場合、オブジェクトの特定の部分のみをデコードする方法はあります。そうすれば、実際に表示する必要がないときにすべての画像が初期化されることがありませんか?私に起こった考えの1つは、アイテム自体とともにアイテムのUIImageを実際にエンコードするのではなく、単なる画像名です。そうすれば、画像は必要に応じて初期化され、必要に応じてアイテム全体をリリースせずにリリースできます。これは一種のリレーショナルデータベースタイプのアプローチだと思います。
このような状況を処理するための標準的な方法があるに違いないと思いますよね?
それとも、記憶消費に対する私の恐怖は根拠のないものですか?おそらくこれは「時期尚早の最適化」の例と見なされる可能性がありますが、私が今行う決定はアプリケーションのデータ構造に深く影響します。オプション#1から#2に変更すると、道を進むことはきれいではありません:)
解決
おそらく、CoreDataとPersistentStoreを使用できます。 CoreDataは、関係を簡単に管理できます。システムによって管理される関係を持つエンティティを作成できます。したがって、あなたの場合、おそらくあなたはカテゴリ、アイテム、画像の3つのエンティティ、およびカテゴリとアイテムの間の多くの関係、およびアイテムと画像の間の多くの関係を持つことができます。つまり、各カテゴリには複数のアイテムを持つことができます。また、各アイテムには複数の画像があります。必要な場合は、新しい画像を作成して特定のアイテムに追加するか、アイテム内のすべての画像を検索できます。
これが明確であることを願っていますが、CoreDataは関係を管理するのに最適で、データモデルは非常に簡単に作業できます。