gpt4 book ai didi

ios - 使用 NSUndoManager 强制保存 NSManagedObject

转载 作者:行者123 更新时间:2023-11-29 01:29:48 27 4
gpt4 key购买 nike

我有一个应用程序通过 websocket 监听服务器事件。当服务器发送特定事件时,我创建一个 Notification,它是 NSManagedObject 的子类。我稍后将其显示在我的主视图 Controller 中。

在 View Controller (我们称之为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 所做的所有操作。

现在的问题是,当我在此 View 中收到通知时,如果我取消对象更改,则 Notification 对象将从 CoreData 中删除。

有没有办法强制 CoreData 保存一个通知,同时其他NSManagedObjects保留在撤消组中?

最佳答案

当您保存上下文时,它会保存上下文中的所有内容。

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

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

但是,此用例可能最好通过创建子上下文来满足。

这样,您的“编辑上下文”就与主上下文分开了。当 View Controller 消失时,您可以保存上下文,或者什么都不做并让它释放。

因此,您仍然可以在“主上下文”中进行更改,并且只有在您选择保存上下文时才会在“编辑上下文”中完成任何操作。

然后您甚至可以不使用撤消管理器,因为临时上下文正在执行这项工作。

编辑

After looking at the apple doc, to create a new context as a child of the main context, I just have to set its parentContext attribute ? I don't know how I lived without knowing this... so useful ! – Sunder

要创建它,是的,这就是您所要做的。使用它有一些缺点,但通常会出现极端情况。只要您不在子上下文中创建新对象并将其对象 ID 传递给另一个 MOC,就应该没问题。

只需进行更改,如果您想与父级共享它们,只需保存到父级即可。但请注意,从子对象保存到父对象只是将对象更改“复制”到父对象中。父上下文仍必须保存其上下文以进行更改才能将其存储到存储中。

关于ios - 使用 NSUndoManager 强制保存 NSManagedObject,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33566708/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com