我有一个应用程序通过websocket监听服务器事件。当服务器发送特定事件时,我创建一个Notification
,它是NSManagedObject
的子类。我稍后在主视图控制器中显示它。
在视图控制器中(我们称之为ObjectViewController
),我有这段代码:
- (void)viewDidLoad {
[super viewDidLoad];
[((AppDelegate *)UIApplication.sharedApplication.delegate).managedObjectContext.undoManager beginUndoGrouping];
}
- (void)viewWillDisappear:(BOOL)animated {
[super viewWillDisappear:animated];
AppDelegate * delegate = ((AppDelegate *)UIApplication.sharedApplication.delegate);
if (something) {
[delegate saveContext];
} else {
[delegate.managedObjectContext undo];
}
}
当我点击取消按钮时,它允许我撤消对多个NSManagedObjects
不同类型的所有操作。
现在的问题是,当我在此视图中并收到通知时,如果取消对象更改,则会从 CoreData 中删除Notification
对象。
有没有办法强制CoreData保存 ONE 通知,而另一个NSManagedObjects
保留在撤消组中?
答案 0 :(得分:1)
保存上下文时,它会将所有内容保存在上下文中。
IMO,更好的方法是使用单独的NSManagedObjectContext
作为"暂存器"。
基本上,您的视图控制器将创建自己的上下文,或者作为主上下文的子项,或者直接连接到主上下文的持久性存储协调器(如果是后者,则需要合并已保存的更改)。
但是,这个用例最好通过创建子上下文来实现。
这样,您的编辑环境"与主要背景分开。当视图控制器消失时,您可以保存上下文,或者只是不做任何事情并让它取消分配。
因此,您仍然可以在"主要环境中进行更改"以及在编辑环境中完成的任何事情"只有在您选择保存上下文时才会发生。
然后你甚至不能使用撤销管理器,因为临时上下文正在做这项工作。
修改强>
在查看苹果文档之后,创建一个新的背景作为孩子 主要上下文,我只需要设置其parentContext属性?一世 在不知道这一点的情况下,我不知道自己的生活......非常有用! - 破甲
要创造它,是的,那就是你要做的一切。使用它有一些缺点,但通常有极端情况。只要你没有在子上下文中创建新对象并将它们的object-id传递给另一个MOC,你应该没问题。
只需进行更改,如果您想与父母分享,只需保存到父级即可。但请注意,从孩子到父母的保存仅仅是复制"对象变为父对象。父上下文仍然必须保存其更改的上下文以使其进入商店。