一个一个保存 NSUndoManager 事务

Save NSUndoManager transactions one by one

我不仅需要在本地将更改保存到 Core Data,还需要在服务器上保存更改。

我担心的是,在我的情况下,用户可以在短时间内进行大量交互。在交互之间没有足够的时间来接收从服务器返回的成功消息。所以要么我锁定 GUI,直到下一条消息 returns - 现在就是这种情况 - 或者选择不同的方法。

我的新方法是让用户进行多次交互并将交易放入 NSUndoManager 提供的 undo stack,在 NSManagedObjectContext 启用, 但保存/提交只有收到成功消息的交易。我如何一次移动撤消 "cursor",一条一条地提交记录,尽管上下文已经包含大量未保存的更改?

NSUndoManager 不太适合这个任务。您可以告诉它撤消或重做操作,但您不能检查这些操作或有选择地在当前撤消堆栈中保存数据。

我过去所做的是创建我自己的传出更改队列。每当本地保存更改时,将这些更改添加到未同步的传出更改列表中。然后使用不同的队列来处理该队列,方法是将它们发送到服务器,如果服务器报告成功,则清除这些更改。您可以使用 NSManagedObjectContextWillSaveNotification and/or NSManagedObjectContextDidSaveNotification 来监视更改并更新出站队列。

这意味着 iOS 设备可能有服务器不知道的排队更改,尤其是在网络不可靠或不可用的情况下。不过,在这些情况下,这几乎是不可避免的,除非你做了一些糟糕的事情,比如在网络恢复之前拒绝让人们进行新的更改。