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
- 此
在单独的子ManagedbjectContext中创建backupManagedObject
- 让用户编辑原始的
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
托管对象将其上下文作为只读属性公开(您不能直接分配它)。托管对象将上下文作为弱引用保存,因此不需要为该对象取消此属性。您应该只取消创建为强引用的属性