gpt4 book ai didi

ios - 使用 2 个链接的 ManagedObjectContext 应用程序撤消 CoreData 更改

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:40:17 25 4
gpt4 key购买 nike

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

对于用户更新,我使用 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)

我的问题是,目前如果用户正在编辑时发生更改并且用户决定执行撤消 - 所有自动提取的更改也会丢失。

作为我考虑的解决方法:

  1. 在用户处于编辑模式时阻止自动更新
  2. 在进行自动更新时阻止编辑模式

但这听起来像是很多工作和潜在的错误。也许有一种方法可以在 MOC 层上解决我的问题,这样用户操作就可以与自动保存分开。

最佳答案

我不知道您是否只是偷工减料,但您需要小心保存上下文的位置。确保在正确的线程上执行此操作。

我猜您有一个私有(private)队列子队列和一个主队列父队列。使用 performBlock... 依次保存每一个。

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

与撤消管理器合并会变得非常困惑,并导致已删除对象等丑陋的问题。我通常只是为了安全而犯错,并在与 removeAllActions 合并后完全清除撤消管理器。

关于ios - 使用 2 个链接的 ManagedObjectContext 应用程序撤消 CoreData 更改,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21657776/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com