使用2链式ManagedObjectContext应用程序撤消CoreData更改

时间:2014-02-09 10:08:55

标签: ios objective-c core-data nsundomanager

我正在开发一个应用程序,用户可以手动编辑某些条目,但也可以从服务器更新。

对于用户更新我正在使用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时正在进行更改 - 所有自动提取的更改也会丢失。

作为一种解决方法,我想到了:

  1. 在用户处于编辑模式时阻止自动更新
  2. 正在进行自动更新时阻止编辑模式
  3. 但这听起来像很多工作和潜在的错误。也许有办法在MOC层解决我的问题,因此用户操作可以与自动保存分开。

2 个答案:

答案 0 :(得分:0)

我不知道你是不是只是偷工减料,但你需要小心保存环境。确保在正确的线程上执行此操作。

我猜你有一个私有队列子节点和一个主队列父节点。使用performBlock ...依次保存每个。

正如其他人所指出的,在保存子项时,您应该取消注册主要的撤消管理器,以防止它为子项的更改生成撤消。

与撤消管理器合并会变得非常混乱,并导致删除对象等的丑陋问题。我通常只是在安全方面犯了错误,并且在与removeAllActions合并之后完全清除撤消管理器。

答案 1 :(得分:0)

你的事情有点混乱。

对于您希望成为原子的用户更新,请使用父子上下文。优点是,必要时可以丢弃对子上下文所做的任何更改。两者都是主要的队列上下文。永远不要在后台使用子上下文(即使用私有队列)它们不是为此设计的,如果你这样做,它只会让你的主线程更加糟糕。

对于后台服务器更新,您应该使用具有新持久性存储协调器的专用队列上下文。请参阅Apple的Earthquakes示例。