17

将我的核心数据模式与服务 JSON 的远程 API 同步的最佳方式是什么?目前,我正在遍历 JSON 响应中的每个字典,检查 Core Data 以查看 API ID 是否存在。

这很好用,但现在剩下要做的就是删除任何不在服务器上的本地对象。这是我的 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 文档中建议的Find-or-Create模式。请参阅此处以获得有效导入数据的深入解释(特别是请参阅有效地实现查找或创建)。

总体思路很简单。有两个对象数组(一个是从 Core Data 中检索的,一个是从服务中检索的),它们是有序的(按顺序排列apiIDid

显然如果有很多数据,我真的建议在后台执行操作。请记住,每个线程都需要依赖其NSManagedObjectContext. 否则利用 iOS 5 API 提供的新队列机制。

为了完整起见,我还建议阅读 RayWenderlich 教程How To Synchronize Core Data with a Web Service Part 1 和 2。它非常有趣。

希望有帮助。

于 2013-01-01T14:10:37.950 回答