17

Core Data スキーマを JSON を提供するリモート API と同期する最良の方法は何ですか? 現時点では、API ID が存在するかどうかを確認するために Core Data をチェックする JSON 応答の各辞書をループしています。

これはうまく機能しますが、サーバー上にないローカル オブジェクトを削除するだけです。これが私の JSON データの例です。

[
   {
      "id":1234,
      "name":"My first object",
      "description":"This is a long string with lots of information"
   },
   {
      "id":1235,
      "name":"My second object",
      "description":"This is a long string with lots of information"
   }
]

現在、これを達成することを考えることができる唯一の方法は、次のようなものです。

NSArray *jsonData = // Convert json data to array using NSJSONSerialization
NSInteger fetchedCount = _fetchedResultsController.fetchedObjects.count;

if (fetchedCount != jsonData.count) {

    for (int i = 0; i < fetchedCount; i++) {

        NSManagedObject *object = [_fetchedResultsController objectAtIndexPath: [NSIndexPath indexPathForItem:i
                                                                                                    inSection:0]];
        NSNumber *idNumber = object.apiID;

        BOOL shouldDelete = YES;

        for (NSDictionary *jsonDict in jsonData) {
            if ([jsonDict  objectForKey:@"id"] == idNumber) {
                shouldDelete = NO;
            }
        }

        if (shouldDelete) {

            // Delete object.
        }            
    }
}

JSON配列に多くのオブジェクトが含まれていると、非常に非効率になると思います。

4

1 に答える 1

23

これは問題ありませんが、Apple doc で提案されているFind-or-Createパターンを適用する必要があると思います。詳細な説明については、データの効率的なインポートを参照してください (特に、効率的な検索または作成の実装を参照してください)。

全体的なアイデアは非常にシンプルです。オブジェクトの 2 つの配列 (Core Data から取得したものとサービスから取得したもの) があり、順序付けられています (byapiIDおよびidresp.)。

もちろん、大量のデータがある場合は、バックグラウンドで操作を実行することをお勧めします。各スレッドはその に依存する必要があることに注意してNSManagedObjectContextください。それ以外の場合は、iOS 5 API によって提供される新しいキュー メカニズムを利用してください。

完全を期すために、RayWenderlich のチュートリアルHow To Synchronize Core Data with a Web Service Part 1 and 2 も読むことをお勧めします。これは非常に興味深いものです。

それが役立つことを願っています。

于 2013-01-01T14:10:37.950 に答える