我正在开发一个应用程序,用户可以手动编辑某些条目,但也可以从服务器更新。
对于用户更新我正在使用UndoManager来允许用户取消/确认更改组。当用户进入编辑模式时,我正在做:
//when edit mode is entered
[[self.contact.managedObjectContext undoManager] beginUndoGrouping];
//when edit mode is finished
[[self.contact.managedObjectContext undoManager] endUndoGrouping];
//depending on button that was pressed to end edit mode, either:
[[self.contact.managedObjectContext undoManager] undo];
//or
[[self.contact managedObjectContext] save:nil];
对于来自服务器的自动更新(对象可以由服务器更改)我正在使用子父MOC。我用来管理编辑模式的那个是父母的。我正在创建一个子MOC,并在后台从服务器拉出更改。在进程结束时我正在做:
[self.moc.save:nil]; //save to local MOC
[self.moc.parentContext.save:nil]; //save to main thread MOC (the one with undo)
我的问题是,如果用户正在编辑并且用户决定进行UNDO时正在进行更改 - 所有自动提取的更改也会丢失。
作为一种解决方法,我想到了:
但这听起来像很多工作和潜在的错误。也许有办法在MOC层解决我的问题,因此用户操作可以与自动保存分开。
答案 0 :(得分:0)
我不知道你是不是只是偷工减料,但你需要小心保存环境。确保在正确的线程上执行此操作。
我猜你有一个私有队列子节点和一个主队列父节点。使用performBlock ...依次保存每个。
正如其他人所指出的,在保存子项时,您应该取消注册主要的撤消管理器,以防止它为子项的更改生成撤消。
与撤消管理器合并会变得非常混乱,并导致删除对象等的丑陋问题。我通常只是在安全方面犯了错误,并且在与removeAllActions
合并之后完全清除撤消管理器。
答案 1 :(得分:0)
你的事情有点混乱。
对于您希望成为原子的用户更新,请使用父子上下文。优点是,必要时可以丢弃对子上下文所做的任何更改。两者都是主要的队列上下文。永远不要在后台使用子上下文(即使用私有队列)它们不是为此设计的,如果你这样做,它只会让你的主线程更加糟糕。
对于后台服务器更新,您应该使用具有新持久性存储协调器的专用队列上下文。请参阅Apple的Earthquakes示例。