ios - 使用 NSUndoManager 强制保存 NSManagedObject

标签 ios objective-c core-data

我有一个应用程序通过 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/

相关文章:

ios - 备份和恢复一个 Core Data SQLite(核心数据)

ios - 有没有办法捏合和缩放以编程方式添加的图像?

jquery - IOS 设备上不会触发orientationchange 事件

iOS - 帮助使用 [NSPredicate predicateWithFormat]

iphone - UIWebView canGoBack 在使用 POST 请求时突然停止工作

objective-c - 方法问题中的多个参数

ios - 如何在最新的MapBox版本(v3.2.2)中添加大图像作为叠加层?

ios - 核心数据与 NSFileManager

ios - UICollectionViewCell 内 ScrollView 内的缩放图像

Swift coredata 按关系属性排序?