これはadesign question
であり、以下は私の問題の背景です。
問題
ニュースアプリを書いています。
フィードから多数のニュースアイテム(アイテムにはタイトル、コンテンツ、画像などが含まれます)をダウンロードします。次に、すべてのアイテムをに保存しますCoreData db
。
同時に、データベースからアイテムをフェッチしてUIに表示することもできます。
CoreData db操作(特に重い場合)がUIに影響を与えて遅れる可能性があることを理解しているので、すべてのCoreData操作NSOpeartionQueue
を最低のスレッド優先度で配置したいと思います。たとえば、一般的な操作は、フィードのすべてのアイテムをフェッチして、UIの準備を整えることです。
CoreDataはスレッドセーフではなく、オペレーションとメインスレッド内のコンテキストが異なるため、ここで質問があります。メインスレッドがそれに応じてUIを更新できるように、これらのアイテムをメインスレッドに渡すにはどうすればよいですか?
提案
私には2つの可能な解決策があります。
最初の解決策は、NSManagedObjectアイテムごとに、コンテキストに関連しない新しいアイテムを作成してから、すべてのニュースアイテムをメインスレッドに戻すことです。次に、メインスレッドはこれらの新しいアイテムを非NSManagedObjectを使用するものとして使用します。このソリューションには欠点があります。メモリコストです。フェッチしたすべてのアイテムのメモリを2倍にする必要があります。
2番目の解決策は、NSOperationでフェッチするときに、それらのアイテムのobjectId以外のものをフェッチしないことです。次に、すべてのobjectIdをメインスレッドに与えると、メインスレッドはそれ自体のコンテキストからすべての実際のNSManagedObjectアイテムを読み取ることができます。このソリューションには欠点もあります。UIの遅延が発生する可能性があります。dbの読み取りは実際にはメインスレッドで再び発生するため、読み取りがUIに影響を与えるのではないかと心配しています。
誰かが私にいくつかの提案をすることができますか?
ありがとう