Ios 删除NSManagedObjectContext

Ios 删除NSManagedObjectContext,ios,objective-c,core-data,nsmanagedobject,nsmanagedobjectcontext,Ios,Objective C,Core Data,Nsmanagedobject,Nsmanagedobjectcontext,我正在尝试创建一个应用程序,其中用户可以在视图中编辑managedObject的属性,并选择Done保存更改,或选择Cancel撤消更改 为了实现此行为,我计划执行以下操作- 加载视图控制器以编辑managedObject时,创建一个backupManagedObject,它是原始managedObject的克隆 此backupManagedObject在单独的子ManagedbjectContext中创建 让用户编辑原始的managedObject 如果: 按下Done,保存原始manag

我正在尝试创建一个应用程序,其中用户可以在视图中编辑
managedObject
的属性,并选择
Done
保存更改,或选择
Cancel
撤消更改

为了实现此行为,我计划执行以下操作-

  • 加载视图控制器以编辑
    managedObject
    时,创建一个
    backupManagedObject
    ,它是原始
    managedObject
    的克隆
  • backupManagedObject
    在单独的子ManagedbjectContext中创建
  • 让用户编辑原始的
    managedObject
  • 如果:
    • 按下
      Done
      ,保存原始
      managedObject
      ,并删除备份
    • 按下
      Cancel
      ,将
      backupManagedObject
      克隆到原始
      managedObject
      并删除备份

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

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

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

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


如果用户决定提交更改,请保存上下文(保存到存储区),否则,只需销毁上下文。

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

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

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


如果用户决定提交更改,请保存上下文(保存到存储区),否则,只需销毁上下文。

您应该以另一种方式执行此操作:

加载编辑视图控制器时,创建新的托管对象上下文这是主对象上下文的子上下文,让我们称之为editingMOC

对editingMOC进行编辑,如果要持久化编辑,请保存editingMOC(这会将更改传播到mainMOC),然后保存mainMOC以将数据保存到持久性存储


如果您希望放弃对editingMOC所做的更改,只需不保存这些更改并让上下文解除锁定即可。

您应该以另一种方式执行此操作:

加载编辑视图控制器时,创建新的托管对象上下文,它是主视图控制器的子对象,我们称之为editingMOC

对editingMOC进行编辑,如果要持久化编辑,请保存editingMOC(这会将更改传播到mainMOC),然后保存mainMOC以将数据保存到持久性存储


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

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

请参阅此链接以获取视频,其中显示了一个应用程序使用类似的方法在iOS上编辑核心数据记录。OSX应用程序使用标准的NSPersistentDocument undo manager


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

请参阅此链接以获取视频,其中显示了一个应用程序使用类似的方法在iOS上编辑核心数据记录。OSX应用程序使用标准的NSPersistentDocument undo manager


明白了,那么您的意思是在加载编辑视图控制器时,使用
existingObjectWithID:error:
将对象从mainMOC复制到editingMOC?因此,如果有任何关系被创建或删除,是否也会提交?是的,每个更改都会被保存。明白了,那么您的意思是,在加载编辑视图控制器时,使用
existingObjectWithID:error:
将对象从mainMOC复制到editingMOC?因此,如果有任何关系被创建或删除,是否也会被提交?是的,每个更改都会被保存。如果使用ARC,我如何破坏上下文。如果我只是设置了
managedObject.managedObjectContext=nil
,它就会被解除分配?我无法设置managedObject的
managedObjectContext
,因为它会给出错误:
No setter方法setManagedObjectContext:for assignment to property
托管对象将其上下文作为只读属性公开(您不能直接分配它)。托管对象将上下文作为弱引用保存,因此不需要为该对象取消此属性。您应该只取消创建为强引用的属性