使用NSUndoManager强制保存NSManagedObject

时间:2015-11-06 12:22:33

标签: ios objective-c core-data

我有一个应用程序通过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保留在撤消组中?

1 个答案:

答案 0 :(得分:1)

保存上下文时,它会将所有内容保存在上下文中。

IMO,更好的方法是使用单独的NSManagedObjectContext作为"暂存器"。

基本上,您的视图控制器将创建自己的上下文,或者作为主上下文的子项,或者直接连接到主上下文的持久性存储协调器(如果是后者,则需要合并已保存的更改)。

但是,这个用例最好通过创建子上下文来实现。

这样,您的编辑环境"与主要背景分开。当视图控制器消失时,您可以保存上下文,或者只是不做任何事情并让它取消分配。

因此,您仍然可以在"主要环境中进行更改"以及在编辑环境中完成的任何事情"只有在您选择保存上下文时才会发生。

然后你甚至不能使用撤销管理器,因为临时上下文正在做这项工作。

修改

  

在查看苹果文档之后,创建一个新的背景作为孩子   主要上下文,我只需要设置其parentContext属性?一世   在不知道这一点的情况下,我不知道自己的生活......非常有用! - 破甲

要创造它,是的,那就是你要做的一切。使用它有一些缺点,但通常有极端情况。只要你没有在子上下文中创建新对象并将它们的object-id传递给另一个MOC,你应该没问题。

只需进行更改,如果您想与父母分享,只需保存到父级即可。但请注意,从孩子到父母的保存仅仅是复制"对象变为父对象。父上下文仍然必须保存其更改的上下文以使其进入商店。