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

squ*_*rog 14 iphone json core-data ios

将我的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"
   }
]
Run Code Online (Sandbox Code Playgroud)

目前,我能想到实现这一目标的唯一方法如下:

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.
        }            
    }
}
Run Code Online (Sandbox Code Playgroud)

我认为如果JSON数组包含很多对象,那将是非常低效的.

Lor*_*o B 21

这可能没问题,但我认为你应该应用Apple doc中建议的Find-or-Create模式.请参阅此处以获得有效导入数据的深入解释(特别是请参阅有效地实现查找或创建).

总体思路很简单.有对象的两个数组(一个你从核心数据检索和你从服务中检索一个)排序(由apiIDidRESP).

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

为了完整起见,我还建议阅读RayWenderlich教程如何使用Web服务第1部分和第2部分同步核心数据.这非常有趣.

希望有所帮助.