【问题标题】:avoid infinite recursion in core data parsing JSON避免核心数据解析 JSON 中的无限递归
【发布时间】:2014-04-17 12:42:42
【问题描述】:
- (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 的结果,其中包含许多项目数组。每个“主要”项目都有一个标签、一个 ID 和另一个项目(它是一个子项目)。

当我使用这个递归函数时,但我的问题是我的递归函数是无限的: 我所有的主要项目都有一个像 (100,200,...) 这样的 id,所以我在主要项目的谓词中使用了模数 100。我的子项目都有一个对应于它们的 Principal 项目的 ID。例如,对于 100,您的子项的 ID 为 101 102 .. 我对这些子项使用最大和最小谓词(我使用 NSRange)作为我的 idToLoad、我的 NSminPredicate 的位置和一个 @ 987654325@ 代表我的 NSmaw 谓词。

【问题讨论】:

  • 我们能看到一些 JSON,以及解析该 JSON 的结果的描述吗?
  • { "status": true, "code": 0, "display": true, "message": null, "results": { "items": [ { "id": "0100", "label": "Actualités", "cover": null, "coverFrom": null, "coverTo": null, "coverOrder": null, "items": [ { "id": "0101", "label": "Actualité / Infos", "cover": null, ....

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


【解决方案1】:

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

编写一个获取请求,返回所有具有特定itemIDItem 实例(希望这是一个只有一个的数组)。然后,在Item 上编写一个类方法(如果您坚持,也可以在NSManagedObject 上编写,但是如果您将NSManagedObject 子类化,您的代码将更容易编写/阅读)。该类方法将NSManagedObjectContextitemID 作为参数,调用您的获取请求,并返回匹配的Item 实例。这就是“查找或创建”中的“查找”部分。

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

【讨论】:

  • 谢谢你的想法,但同时我试图做其他事情,我在我的模型中添加了一个带有 ParentID 的字符串,如果它是 Parent 并且如果它是 subItem 或ChildItem,它将具有与它的 Parent 相同的 ParentId !我想改变我的代码的最小值!!你对我怎么做有什么建议吗!因为我有点失落:(
  • 不使用 ParentID 字符串,只需在父子之间建立直接链接(关系)。听起来您可能在考虑过多的数据库隐喻。 Core Data 是一个对象图,而不是数据库。只是建立联系。不用担心钥匙。
  • 这几乎是我所做的(我删除了项目和自身之间的递归关系,我使用单个实体项目并添加 ParentID 像一个属性如果 ParentID = nil 那么它是一个 Parent 否则它是一个孩子,我在我的谓词中使用它,它几乎工作得很好,除了我现在有另一个问题我猜它是 NSFertechedReslutController 故障:p ...问题是我每次都有同一个项目(子项目)的多个实例然后我点击后面的按钮,它一遍又一遍地获取相同的对象!
猜你喜欢
  • 2021-07-31
  • 2013-05-25
  • 1970-01-01
  • 2012-08-24
  • 2020-11-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-05
相关资源
最近更新 更多