【问题标题】:Multiple layers of MOC merges...CoreData veterans, what do you think?多层MOC合并……CoreData老手,你怎么看?
【发布时间】:2010-08-12 08:33:40
【问题描述】:

原始问题已得到解答。更新地址在 cmets 中提出的相关问题。

原帖:

我正在使用 Apple 的 CoreDataBooks 中使用的 MOC 保存方法。但是,我似乎使用了两层 MOC 合并(三个 MOC,其中第三层与第二层合并,然后第二层与第一层合并)。

首先,我有一个列出学校课程的表格视图 (ClassList)。选择一个类会推送一个 2 行表视图 (AddClass)。在 AddClass 中,第一行允许用户编辑类标题。选择第二行会推送一个 tableview (ClassRoster),它显示该班级的学生名单。最后,选择一个学生会推送另一个 2 行表格视图 (AddStudent),用户可以在其中编辑学生姓名和用户名。

我可以使用双 MOC 合并方法(CoreDataBooks 使用的 managedObjectContext 和addingManagedObjectContext)成功地添加和保存类。我将在我的第一个视图中将“基础 MOC”称为“MOC1”并将“暂存器”MOC 称为“MOC2”。

MOC2 临时存储对类对象所做的更改。然后可以保存或取消这些更改,向代理发送-didFinishWithSave:(BOOL)。如果我保存,在 MOC2 中所做的更改将与 MOC1 合并。该合并运行良好。

处理对学生对象所做的更改是我出错的地方。我想我可以使用 MOC3 作为暂存器来更改将与 MOC2 合并的学生对象(当我保存一个学生对象时)。当我保存类对象时,MOC2 可以反过来与 MOC1 一起保存。

但是我在保存 MOC3 并将学生对象添加到类对象时遇到了错误,因为它们位于不同的上下文中。我可以发布代码,但首先我想问一个更大的问题:我是不是走错了路?

更新:

先生。 Zarra 建议使用initWithEntity:insertIntoManagedObjectContext: 并将 MOC 设置为 nil,从而创建一个临时对象,稍后可以设置并保存其 MOC。

按照他的建议,我正在尝试合并以下代码:

    NSManagedObjectModel *managedObjectModel - [[managedObjectContext persistentStoreCoordinator] managedObjectModel];
    NSEntityDescription *entity = [[managedObjectModel entitiesByName] objectForKey:@"MyClass"];
    MyClass *newClass = [[MyClass alloc] initWithEntity:entity insertIntoManagedObjectContext:nil];

我遇到了一个错误,但我不确定它是否与此代码相关。我将调试并发布我发现的内容。

【问题讨论】:

    标签: core-data nsmanagedobjectcontext


    【解决方案1】:

    是的。您不需要使用多个NSManagedObjectContext。这个例子是一个非常糟糕的例子。在您的情况下,您应该使用单个上下文,这将消除您的所有问题。

    如果您想要一个临时实体,请使用 nil NSManagedObjectContext 创建它。当你想保存它时,你调用-setManagedObjectContext:,然后保存NSManagedObjectContext

    您真正想要使用多个NSManagedObjectContext 的唯一时间是在多线程情况下。

    【讨论】:

    • 再次感谢 Zarra 先生。你说的“那个例子很差”是什么意思?你的意思是我的问题写得不好?如果是这样的话,我会欢迎一些建设性的批评。
    • 不,Apple提供的那个例子是一个非常糟糕的例子。这是一个可怕的例子,不幸的是,它不断被复制,然后因为“Apple 写的”而被辩护。
    • 啊...好吧,我很乐意使用任何可行的方法:P 在使用 Apple 示例之前,我曾尝试采用自定义方法但收效甚微,至少让我的取消和保存功能正确同步.但我同意……Apple 代码似乎过于密集且不直观。你知道任何写得更好的公开例子吗?
    • 可能是CIMGF.comMac Developer Network 上的一些项目。您可以使用 Apple 示例,只需删除额外的 MOC 并推动单个 MOC。当您在添加视图中创建新实体时,只需使用其-initWithEntity:insertIntoManagedObjectContext:,但将 nil 作为NSManagedObjectContext 传递。非常直接。
    • 我正在使用这一行来初始化我的临时实体:addViewController.newClass = (myClass *) [NSEntityDescription insertNewObjectForEntityForName: @"myClass" inManagedObjectContext:nil]; 这是我应该使用的吗?我没有看到像您在上面的评论中写的那样的方法。如果那条线踢回了这个错误,我做错了什么? “'NSInternalInconsistencyException',原因:'+entityForName: 找不到实体名称'myClass'的 NSManagedObjectModel”
    猜你喜欢
    • 1970-01-01
    • 2013-01-02
    • 2012-02-22
    • 2019-07-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多