将数据与JSON API同步的最有效方法是什么?

时间:2013-01-01 10:02:45

标签: iphone ios json core-data

将我的Core Data架构与提供JSON的远程API同步的最佳方法是什么?目前,我正在循环查看JSON响应中的每个字典,检查核心数据以查看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数组包含大量对象,我认为这将是非常低效的。

1 个答案:

答案 0 :(得分:21)

这可能没问题,但我认为你应该应用Apple doc中建议的 Find-or-Create 模式。请参阅此处获取深入解释Efficiently Importing Data(特别参见有效实施查找或创建)。

总体思路很简单。拥有两个对象数组(您从Core Data检索的对象和从服务检索的对象)(按apiIDid分配)。

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

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

希望有所帮助。