代码之家  ›  专栏  ›  技术社区  ›  rano

CoreData:发布ManagedObject

  •  1
  • rano  · 技术社区  · 14 年前

    我在ios4iphone应用程序中使用CoreData(SQLite作为存储)来存储最初从xml文件检索的数据。我的数据模型包含超过15个实体,我担心内存消耗,因为我看到CoreData在内存中创建所有NSManagedObject来表示数据模型的对象图。 我看到我必须使用refreshObject:mergeChanges:来平衡每个对象在通过关系(如数据模型中所设计)与其他对象关联时接收到的多个retain。我是在保存上下文之后这样做的,但是下一次当我再次尝试在商店中查找时,试图获取我插入的内容,然后它将不返回任何内容。 我错过什么了吗?

    3 回复  |  直到 14 年前
        1
  •  2
  •   Alfonso    14 年前

    如果您所做的只是导入(例如,您不需要保留插入的对象以显示给用户等等),那么您只需使用 [moc reset] 救人之后。所以算法看起来像这样:

    NSManagedObjectContext* moc = ...;
    while ([xmlData hasMoreObjects]) {
        // Create e.g. 500 objects and insert them into the managed object context
        NSError* error = nil;
        if (![moc save:&error]) {
            // handle the error
        }
        [moc reset]; // Here the inserted objects get released in the core data stack
    }
    

    重置托管对象上下文的作用与刷新每个对象的作用相同(与以前一样)。你也应该考虑使用 [[NSManagedObject alloc] initWithEntity:insertIntoManagedObjectContext:] NSEntityDescription ,因为您可以在不再需要它们之后立即释放它们,并且在清除自动释放池之前,它们不会保留在内存中。

        2
  •  1
  •   TechZen    14 年前

    不能直接/手动管理托管对象的内存,因为上下文控制了对象的生命周期以保持图形完整性。

    如果可以在离散块中处理导入,请在每个块后面保存上下文,然后:

    [context refreshObject:theObject mergeChanges:NO]
    

    您只需要使用错误来设置与的关系,这样在前一块中处理的对象仍然可以在当前块中的关系中设置。

    Efficiently Importing Data 如果你还没这么做的话。

        3
  •  0
  •   Pieter Jongsma    14 年前

    我想你每次改变都得这么做

    NSManagedObjectContext *moc;
    NSError *error;
    [moc save:&error];
    

    否则将被丢弃