如何在Core Data NSManagedObjectContext中恢复NSUndoManager内容?

时间:2009-12-30 23:02:00

标签: iphone core-data undo redo

我想在CoreData(NSManagedObject)对象上的iPhone应用程序中使用NSUndoManager,以便我可以保存(并稍后恢复)NSUndoManager的状态,如果应用程序过早退出(例如,由于电话呼入进入)。即与自动丢弃或保存NSUndoManager中累积的更改相反,我想恢复它们,以便用户可以选择在重新启动应用程序时显式丢弃或保存它们。

有没有人有这方面的经验?当应用程序中断时,任何人都可以推荐这种(或替代)方法来管理NSManagedObjectContext中的挂起更改吗?

2 个答案:

答案 0 :(得分:2)

NSUndoManager实际上并不存储状态,它存储一堆将恢复状态的操作。例如,如果您有一个对象XXX并且它的属性名称是一个字符串,并且您将该名称从“Steve”更改为“Joe”,则NSUndoManager存储的是目标,选择器和对象。目标是XXX的实例,选择器为@selector(setName:),对象为@"Steve"

通过存储该信息,如果弹出撤消堆栈,它将在对象XXX的实例上调用-setName:,其值为@“Steve”,从而恢复其状态。围绕KVO等还有一些额外的工作,但这是基础知识。

首先,我推断您可以写出NSManagedObjectID,选择器(使用NSStringFromSelector)和对象到磁盘,并通过调用-registerUndoWithTarget: selector: object:来恢复它们。但是,在进一步审查文档时,无法访问堆栈以便能够迭代它。

答案 1 :(得分:0)

请注意,通过使用单独的NSManagedObjectContexts存在一种可能的解决方法,使得一些在关闭时保存,而其他的则回滚其更改。它并不完美,但我找到了一个合适的解决方案来解决我的问题。