避免核心数据解析JSON中的无限递归

时间:2014-04-17 12:42:43

标签: objective-c json parsing core-data recursion

- (void)tranformJSONItems:(NSArray *)jsonItems inCoreDataItem:(Item *)item {
/* Get the managed object context */
NSManagedObjectContext *managedObjectContext = [self managedObjectContext];
[jsonItems enumerateObjectsUsingBlock:^(NSDictionary *jsonItem, NSUInteger idx, BOOL *stop) {
    Item *newItem = (Item *)[NSEntityDescription insertNewObjectForEntityForName:NSStringFromClass([Item class]) inManagedObjectContext:managedObjectContext];
    newItem.label = jsonItem[@"label"];
    newItem.itemID = [self.numberFormatter numberFromString:jsonItem[@"id"]];
    if (nil!=item) {
        [item addSubItemsObject:newItem];
    }
    NSArray *subitems = jsonItem[@"items"];
    if (nil!=subitems) {
        [self tranformJSONItems:subitems inCoreDataItem:newItem];
    }
}];
if (nil==item)
    [self saveChanges];
}

我想创建一个解析JSON并将其转换为Core Data的应用程序,但我拥有的JSON非常奇怪和困难(它的嵌套和递归)。

在我的JSON中,我有NSDictionary个结果,其中包含许多项目数组。每个'校长' item有一个标签,一个ID和另一个Item(这是一个子项)。

当我使用这个递归函数时,我的问题是我的递归函数是无限的: 所有我的主要项目都有一个像(100,200,...)的ID所以我在我的谓词中使用了模数100作为主要项目。我的子项目都有一个与其主要项目相对应的ID。例如,对于100,你有子目标,其ID为101 102 ..我使用max和min谓词为我的idToLoad(我使用NSRange),我的{{I} {1}},以及NSminPredicate谓词的NSMaxRange

1 个答案:

答案 0 :(得分:0)

不要总是插入新项目,而是为特定itemID实现查找或创建模式。

写一个获取请求,返回具有特定Item的所有itemID个实例(希望这只是一个数组)。然后,如果你坚持的话,在Item(或NSManagedObject上)写一个类方法,但如果你继承NSManagedObject,你的代码会更容易编写/读取。该类方法将NSManagedObjectContextitemID作为参数,调用您的获取请求,并返回匹配的Item实例。这就是“发现或创造”中的“发现”部分。

现在,编写另一个类方法,接受与上面的“find”方法相同的参数。此方法执行提取。如果找到匹配项,则返回该实例。如果找不到匹配项,则插入新的Entity,使用itemID对其进行初始化,然后返回。这是“查找或创建”:它始终返回具有正确itemID的实例,除非需要,否则永远不会创建新实例。