如何使用 CoreData 为某些操作/实体禁用 NSUndoManager?

Posted

技术标签:

【中文标题】如何使用 CoreData 为某些操作/实体禁用 NSUndoManager?【英文标题】:How to disable the NSUndoManager for certain actions/entities with CoreData? 【发布时间】:2014-01-07 14:52:21 【问题描述】:

我在OSX 上与CoreData 一起工作(但我猜ios 的问题是一样的)。

我想禁用创建/删除NSManagedObjects 的撤消管理。但是,如果可能的话,我会保留对我的实体的属性(如NSStrings 等)的撤消管理。

我该怎么做?

如果可能,我想要一个全局解决方案,例如子类 MyManagedObjectof NSManagedObject 带有覆盖的方法(awakeFromInsertprepareForDeletion)。

【问题讨论】:

【参考方案1】:

NSUndoManagerdisableUndoRegistrationenableUndoRegistration 方法来实现这一点。您需要拦截您不想撤消的操作,并酌情禁用/启用撤消管理器。请注意,启用和禁用的调用必须平衡(不要在没有调用(或已经调用)另一个的情况下调用一个。确保撤消任何操作不会导致无效状态也是您的责任(这是beginUndoGrouping)。

【讨论】:

我希望我能找到一种在全球范围内执行此操作的方法:NSUndoManager 将忽略所有创建/删除... 该功能多久使用一次?它多久会导致无法保存的上下文(验证问题)?此功能可能对您有用,但对很多人不太可能有用,所以我不能说我希望它会被添加。您可以将其包装在子类或辅助方法中... 确实,即使只是按照自己的想法去做也可能会在未来给您带来麻烦——小心行事... 我不明白为什么阻止撤消/重做会产生问题! 您的实体有任何非可选属性吗?【参考方案2】:

您可以决定将NSUndoManagerNSManagedObjectContext 联系起来:

    [self.managedObjectContext setUndoManager:nil] ;

【讨论】:

以上是关于如何使用 CoreData 为某些操作/实体禁用 NSUndoManager?的主要内容,如果未能解决你的问题,请参考以下文章

OSX CoreData:仅针对某些实体的问题:+entityForName:在此模型中找不到名为“myEntity”的实体

如何在symfony中禁用doctrine的软删除(软删除)过滤器

使用多个实体进行 CoreData 编程

如何在 Swift 3 中将自定义类保存为 CoreData 实体的属性?

在 CoreData 中迁移实体父级

CoreData Parent Children 使用单个实体的一对多反向关系