13

Web API から取得した Core Data にオブジェクトをインポートする NSOperationQueue があります。各操作には、アプリのメインの managedObjectContext のプライベートな子 managedObjectContext があります。各操作は、インポートするオブジェクトを取得し、オブジェクトが既に存在するかどうかを確認します。存在する場合は、既存のオブジェクトを更新します。オブジェクトが存在しない場合、この新しいオブジェクトが作成されます。プライベートな子コンテキストでのこれらの変更は、メインの管理対象オブジェクト コンテキストまで伝播されます。

このセットアップは私にとっては非常にうまく機能しましたが、重複の問題があります。

同じオブジェクトを 2 つの異なる同時操作でインポートすると、まったく同じデータを持つ重複したオブジェクトが得られます。(どちらもオブジェクトが存在するかどうかを確認しますが、既に存在しているようには見えません)。2 つの同じオブジェクトをほぼ同時にインポートする理由は、「get」API 呼び出しだけでなく「新しい」API 呼び出しも頻繁に処理するためです。私の設定は同時に非同期であるため、インポートしようとしているオブジェクトが重複しないようにするのは困難です。

だから私の質問は、この特定の問題を解決する最良の方法は何ですか? インポートを最大同時操作数 1 に制限することを考えました (パフォーマンスのためにこれは好きではありません)。同様に、すべてのインポート操作の後に保存を要求し、コンテキストのマージを処理しようとすることを検討しました。また、後でデータをグルーミングして、重複を時々クリーンアップすることも検討しました。そして最後に、すべてのフェッチ要求で重複を処理することを検討しました。しかし、これらの解決策のどれも私には素晴らしいとは思えません。おそらく、私が見落とした簡単な解決策があるでしょう。

4

3 に答える 3

5

問題は次のとおりです。

  • コンテキストはスクラッチパッドです — 保存しない限り、保存するまで、それらに加えた変更は永続ストアにプッシュされません。
  • あるコンテキストで、まだプッシュされていない別のコンテキストで行われた変更を認識する必要があります。

私には、コンテキスト間のマージがうまくいかないように思えます — コンテキストはスレッドセーフではありません。したがって、マージが発生するために、他のコンテキストのスレッド/キューで進行中のものは他にありません。したがって、別のコンテキストが挿入プロセスの途中である間に新しいオブジェクトが挿入されるというリスクを排除することはできません。

追加の観察:

  • SQLite は実際にはスレッド セーフではありません。
  • したがって、発行方法に関係なく、永続ストアへのすべてのトリップはシリアル化されます。

問題と SQLite の制限を念頭に置いて、私のアプリでは、Web 呼び出しが に従って自然に同時実行されるフレームワークを採用しましNSURLConnectionた。結果のその後の解析 (JSON 解析と結果へのいくつかの釣り) が同時に発生し、次に検索が行われます。 -or-create ステップがシリアル キューに送られます。

いずれにせよ SQLite トリップはシリアル化されるため、シリアル化によって失われる処理時間はほとんどなく、それらはシリアル化されたものの圧倒的多数です。

于 2013-08-14T21:48:56.377 に答える
3

操作間の依存関係を作成することから始めます。依存関係が完了するまで完了できないことを確認してください。

http://developer.apple.com/library/mac/documentation/Cocoa/Reference/NSOperation_class/Reference/Reference.html#//apple_ref/occ/instm/NSOperation/addDependencyをチェックしてください:

各操作は、終了時に保存を呼び出す必要があります。次に、ここで提案されている検索または作成の方法論を試してみます。

https://developer.apple.com/library/ios/documentation/Cocoa/Conceptual/CoreData/Articles/cdImporting.html

これにより、重複の問題が解決され、フェッチの回数が減る可能性があります (フェッチは高価で時間がかかるため、バッテリーの消耗が早くなります)。

グローバルな子コンテキストを作成してすべてのインポートを処理し、最後に巨大なもの全体をマージすることもできますが、実際にはデータ セットの大きさとメモリの考慮事項に依存します。

于 2013-08-14T21:16:41.073 に答える