これが新しいトピックではないことはわかっていますが、私の問題に対する明確な答えは見つかりませんでした。
「本」を含むコアデータモデルを持つプロジェクトに取り組んでいます。したがって、ネットワーク経由で json データをダウンロードするときは、これらの Book モデルをコア データに格納し (もちろん、UI をブロックしないようにバックグラウンド スレッドで)、これらの Book モデルをコントローラーとロード テーブルに渡します。
しかし、Apple の Core Data Reference を知ったとき、私は戸惑いました。ドキュメントには、コンテキスト間で管理対象オブジェクトを渡すべきではないと書かれています。しかし、私は 2 つのコンテキストを持っています。1 つはメイン スレッド用で、もう 1 つはバックグラウンド スレッド用で、ダウンロード、データの保存、現在の更新データの取得に使用されます。したがって、バックグラウンドでマネージド オブジェクト ID をフェッチし、これらの ID をメイン スレッドのコンテキストに渡し、メイン スレッドでこれらの ID を持つマネージド オブジェクトを取得する必要があります。
ここで問題が発生します。メイン スレッド ブロック UI で ID を持つマネージド オブジェクトを取得しますか? メイン スレッドで ID を持つマネージド オブジェクトを取得する場合、SQLite にアクセスしていますか? そして、これらのフェッチされた管理対象オブジェクトの一部に障害がある場合、つまり、それらのプロパティを取得したい場合に IO を実行できることを意味しますが、それでも UI がブロックされると思います。
では、Core Data を使用してバックグラウンドでデータを取得し、これらのデータをメイン スレッド (UI 操作はメイン スレッドで行う必要があります) で UI をブロックせずに表示するための実用的なパターンは何ですか?
助けてくれてありがとう!
再考:
実際、すべての答えが私の問題を解決していません。 ただし、コアデータで複数のスレッドプログラミングを使用する必要がある場合の考慮事項に戻ります。ほとんどの場合、コア データをそのまま使用するだけで十分効率的です。メイン スレッドでのコア データ操作のコストを過大評価してしまいました。
しかし、バックグラウンドで取得し、メインスレッドで表示する実用的なパターンを誰かに勧めてもらいたいです。私はそれを感謝します!