NSUndoManager 检测核心数据实体的实际删除

Posted

技术标签:

【中文标题】NSUndoManager 检测核心数据实体的实际删除【英文标题】:NSUndoManager detect actual deletion of Core Data entities 【发布时间】:2014-10-21 09:25:43 【问题描述】:

我正在寻找一种方法来了解 Core Data 实体何时真正从数据存储中删除。

我将NSUndoManager 连接到我的NSManagedObjectContext,到目前为止一切正常。

现状

我正在构建一个应用程序,允许用户创建Rooms 并在每个房间添加一些图片。当用户想要创建一个新房间时,我使用以下代码在 NSUndoManager 中创建一个操作:

[[[NSManagedObjectContext MR_defaultContext] undoManager] beginUndoGrouping];
[[[NSManagedObjectContext MR_defaultContext] undoManager] setActionName:@"Create Room"];

然后是undo,当用户按下取消。这会导致撤消所有更改并删除新创建的临时 Room 对象。

然后用户将Pictures 用于这个临时的Room 对象。我将实际图像存储在磁盘上,并将filePath 作为NSString 属性存储在Picture 实体中。当用户手动删除房间中的图片时,我使用Picture 上的prepareForDeletion: 方法从磁盘中删除图片。

问题

现在想象一下用户稍后打开Room 实体,删除Picture 然后按取消 的情况。 NSUndoManager 现在撤消所有操作。当用户删除图片时,实际图像从磁盘中删除但是Picture 对象由 NSUndoManager 恢复,filePath 现在设置为物理删除的图像。

有没有办法知道图片何时真正被删除(即在 prepareForDeletion 中:)?我的意思是,它被用户删除了,并且没有被撤消操作带回来?

我真的不应该每 x 天从我的应用文档中删除任何内容并清理未链接的照片吗?或者我应该跟踪用户删除了哪个Pictures,并在用户按save 而不是cancel 时将它们排队等待删除?

【问题讨论】:

【参考方案1】:

“解决”了这个问题,只是从不通过任何用户操作从磁盘中删除,并在每次应用启动时运行清理方法。

【讨论】:

以上是关于NSUndoManager 检测核心数据实体的实际删除的主要内容,如果未能解决你的问题,请参考以下文章

取消编辑:NSUndoManager 或单独的 NSManagedObjectContext 进行编辑?

核心数据:检测孩子何时被删除

核心数据获取实际存储在persistentStore中的数据,而不是实体的所有对象(persistentStored +最新创建的obj)

检测对单个 coredata 实体的更改

核心数据:观察某种类型的新实体

NSPredicate 检测存在于多个实体关系中的一整组实体