3

これが新しいトピックではないことはわかっていますが、私の問題に対する明確な答えは見つかりませんでした。

「本」を含むコアデータモデルを持つプロジェクトに取り組んでいます。したがって、ネットワーク経由で json データをダウンロードするときは、これらの Book モデルをコア データに格納し (もちろん、UI をブロックしないようにバックグラウンド スレッドで)、これらの Book モデルをコントローラーとロード テーブルに渡します。

しかし、Apple の Core Data Reference を知ったとき、私は戸惑いました。ドキュメントには、コンテキスト間で管理対象オブジェクトを渡すべきではないと書かれています。しかし、私は 2 つのコンテキストを持っています。1 つはメイン スレッド用で、もう 1 つはバックグラウンド スレッド用で、ダウンロード、データの保存、現在の更新データの取得に使用されます。したがって、バックグラウンドでマネージド オブジェクト ID をフェッチし、これらの ID をメイン スレッドのコンテキストに渡し、メイン スレッドでこれらの ID を持つマネージド オブジェクトを取得する必要があります。

ここで問題が発生します。メイン スレッド ブロック UI で ID を持つマネージド オブジェクトを取得しますか? メイン スレッドで ID を持つマネージド オブジェクトを取得する場合、SQLite にアクセスしていますか? そして、これらのフェッチされた管理対象オブジェクトの一部に障害がある場合、つまり、それらのプロパティを取得したい場合に IO を実行できることを意味しますが、それでも UI がブロックされると思います。

では、Core Data を使用してバックグラウンドでデータを取得し、これらのデータをメイン スレッド (UI 操作はメイン スレッドで行う必要があります) で UI をブロックせずに表示するための実用的なパターンは何ですか?

助けてくれてありがとう!


再考:

実際、すべての答えが私の問題を解決していません。 ただし、コアデータで複数のスレッドプログラミングを使用する必要がある場合の考慮事項に戻ります。ほとんどの場合、コア データをそのまま使用するだけで十分効率的です。メイン スレッドでのコア データ操作のコストを過大評価してしまいました。

しかし、バックグラウンドで取得し、メインスレッドで表示する実用的なパターンを誰かに勧めてもらいたいです。私はそれを感謝します!

4

5 に答える 5

3

In your case, I would use three MOCs.

NSManagedObjectContext *worker = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSPrivateQueueConcurrencyTyep];
worker.persistentStoreCoordinator = // your PSC
NSManagedObjectContext *main = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSMainQueueConcurrencyType];
main.parentContext = worker;

Then, whenever you want to perform background stuff, create a background MOC as a child of the main MOC.

NSManagedObjectContext *background = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSPrivateQueueConcurrencyType];
background.parentContext = main;

Remember, saving a context only saves one level. So, when you save the background context, changes will be automatically pushed into the main context.

You can then save the main context whenever you want... but at some point you need to save the worker context. UIManagedDocument handles the main/worker save interaction for you automatically (but you give up some control when using it).

The other benefit you get here is that the actual IO operations are not happening in the main thread.

于 2013-04-23T13:42:36.660 に答える
0

これが役に立つかどうかはわかりませんが、素晴らしい Cocoa is my girlfriend ブログでこのブログ エントリを試してみてください: Core Data and Threads, Without the Headache

この問題へのいくつかのアプローチを説明し、UI とメイン スレッドの質問も扱います。

于 2013-04-23T08:45:48.093 に答える
0

バックグラウンド スレッドでデータのダウンロードを実行してから、メイン スレッドで更新/挿入操作を実行する必要があります。

于 2013-04-23T08:16:55.197 に答える