删除 NSManagedObjectContext

Posted

技术标签:

【中文标题】删除 NSManagedObjectContext【英文标题】:Deleting NSManagedObjectContext 【发布时间】:2014-01-02 09:49:26 【问题描述】:

我正在尝试制作一个应用程序,用户可以在其中编辑视图中managedObject 的属性,然后选择Done 以保留更改,或选择Cancel 以撤消更改。

为了实现这种行为,我计划做以下事情-

加载视图控制器以编辑managedObject 时,创建一个backupManagedObject,它是原始managedObject 的克隆。 这个backupManagedObject是在一个单独的child ManagedObjectContext中创建的。 让用户编辑原来的managedObject。 如果: Done被按下,原来的managedObject被持久化,备份被删除 按下Cancel,将backupManagedObject克隆为原始managedObject并删除备份

我的问题是,一旦我完成了backupManagedObject,我该如何删除childManagedObjectContext,它将不再有托管对象并且我不打算再使用它们(对于每个新的视图控制器,我计划只创建一个新的子托管对象上下文并在视图控制器完成后将其销毁)。

【问题讨论】:

【参考方案1】:

你应该反过来做:

当您加载您的编辑视图控制器时,创建新的 Managed Object Context,它是您的主视图控制器的子对象,我们称之为 editingMOC

editingMOC 进行编辑,如果要保留它们,请保存 editingMOC(这会将更改传播到 mainMOC ),然后保存 mainMOC 以将数据保存到持久存储中。

如果您希望放弃对 editingMOC 所做的更改,只需不要保存它们并让上下文被释放。

【讨论】:

明白了,你的意思是在加载编辑视图控制器时,使用existingObjectWithID:error: 将对象从mainMOC 复制到editingMOC?因此,如果创建或删除了任何关系,是否也会提交? 是的,每个更改都会被保存。【参考方案2】:

通常,托管对象上下文的释放方式与 Objective-C 中任何其他对象的释放和释放方式相同。

如果您使用的是 ARC,只需在不再需要该属性时将其设置为 nil,它将与任何未保存的更改一起被销毁。

但是,您解决此问题的方法有点复杂。 您可以简单地创建一个新的“编辑”子上下文,获取您想要在该上下文中编辑的对象并对对象进行更改。

如果用户决定提交更改,则保存上下文(直到存储),如果没有,则简单地销毁上下文。

【讨论】:

如果我使用 ARC,如何销毁上下文。如果我只是设置managedObject.managedObjectContext = nil,它会被释放吗? 我无法设置 managedObject 的 managedObjectContext,因为它给出了错误:No setter method setManagedObjectContext: for assignment to property 托管对象将其上下文公开为只读属性(您不能直接分配它)。托管对象将上下文保存为弱引用,因此无需为对象取消此属性。您应该只取消您创建的作为对“编辑”上下文的强引用的属性,当最后一个被取消时,上下文将被释放。【参考方案3】:

更简单的方法是使用来自 NSManagedObject 属性的数据简单地创建视图并填充 UI 控件(文本字段等)。如果用户进行任何编辑,则设置一个标志,以便您知道是否进行了更改,然后当他们选择完成时,使用 UI 控件中的值更新 NSManagedObject 属性并保存 MOC。如果他们选择取消,则什么也不做。

查看此链接以获取视频,该视频展示了使用类似方法在 ios 上编辑 Core Data 记录的应用。 OSX 应用使用标准 NSPersistentDocument 撤消管理器。

http://ossh.com.au/design-and-technology/software-development/uimanageddocument-icloud-integration/os-x-and-ios-app-integration-with-core-data-and-icloud/

【讨论】:

以上是关于删除 NSManagedObjectContext的主要内容,如果未能解决你的问题,请参考以下文章

从另一个方法中删除 NSManagedObjectContext 中的对象

在嵌套的 NSManagedObjectContext 中缓慢删除和保存

了解核心数据并在删除后保存 NSManagedObjectContext

如何清除 NSManagedObjectContext 中的所有对象?

使用 NSManagedObjectContext 清除整个核心数据

核心数据:如何在两个 NSManagedObjectContext 之间合并插入/更新/删除,同时将合并保持为可撤消的步骤?