2009-12-30 18 views
4

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

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

回答

2

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

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

起初我推测你可以写出NSManagedObjectID,选择器(使用NSStringFromSelector)和对象到磁盘并通过调用-registerUndoWithTarget: selector: object:来恢复它们。但是,在进一步阅读文档后,无法访问堆栈以便能够遍历它。

+0

不幸的是,我同意。似乎没有一种方便和简单的方法来做到这一点。当然有解决方法,但没有什么优雅的想法。 – 2010-01-15 15:06:02

0

请注意,通过使用单独的NSManagedObjectContexts存在一种可能的解决方法,以便一些在关机时保存,而另一些则将其更改回滚。这并不完美,但我发现了一个合适的解决方案来解决这个问题。