使用 Cocoa 和 Core Data 自动保存

Posted

技术标签:

【中文标题】使用 Cocoa 和 Core Data 自动保存【英文标题】:Auto-save with Cocoa and Core Data 【发布时间】:2009-09-30 19:57:15 【问题描述】:

我正在开发一个非基于文档的核心数据应用程序。

我希望在更改发生时保存更改。这是用户在此类应用程序中所期望的。这也是 Apple 在 iPhotoiTunes 中实现的功能。

一种蛮力方法是设置一个计时器以频繁保存。然后由保存触发的方法将吞下所有验证错误,以免打扰用户。只有在退出时,用户才会被窃听来安排数据以便保存。恕我直言,这种方法很臭。

所以我在想,一定有办法以某种方式将保存与NSEditor 协议之类的东西挂钩。每次用户(或控制器)完成编辑数据时,应以某种方式通知应用程序委托触发保存操作。问题是我不知道该去哪里找。

我认为对于更复杂的操作,可能需要进行一些交叉验证,我会向用户提供一些与专用NSManagedObjectContext相关的界面。

【问题讨论】:

如果您已经支持撤消,只需在每次将内容推送到撤消堆栈时将其保存。 我还不支持撤消。我只使用 CoreData 提供的。但是您正在为扩展撤消支持提供强有力的理由。 这个帖子很老了。我不清楚 processPendingTransactions 是否仍然存在。在这里尝试一些对我有用的东西,不知道它是否完全平行:***.com/a/44120342/826946 【参考方案1】:

在 AppKit 应用程序中的每个事件结束时,CoreData 将为您运行 -processPendingTransactions。

这样做的一个副作用是,如果您已向 NSManagedObjectContext 注册以接收更改通知,您将在每个事件结束时被调用。

因此,例如,在您的通知处理程序中,您可以调用 just tell context to save。

但是,您可能会偏执于在同一上下文的回调中对上下文进行保存,因此如果您执行 performSelector:@selector(save:) afterDelay: 来推送保存,您可能会感觉更好直到 -processPendingTransactions 完成之后。

您甚至可以在 -save: 选择器上执行取消之前的操作,并将延迟设置为 5 秒,因此如果用户或应用程序处于一堆更改的中间,它们将全部合并为一个保存。

事实上,这正是 Delicious Library 1.0-1.09 的工作原理。

-威尔

【讨论】:

感谢您的提示。您的建议和搭载撤消管理器的想法似乎都很棒。当然,您的评论引出了一个问题:为什么最近版本的 Delicious Library 不再使用这种技术? 我决定尝试立即保存而不是延迟后保存,因为我同时在多个线程中运行,例如,当您在主线程中创建封面时,您真的想要背景图形线程的 managedObjectContexts 可以立即看到封面,而不是在您自动保存时的三秒钟内。 那么您是否仍然调用 performSelector:@selector(save:) afterDelay: 还是使用其他方法来自动保存上下文? 我手动处理 PendingChanges 并保存在我的代码中的某些阻塞点,因为无论如何添加或删除对象时都需要 processPendingChanges 来更新 UI。 我刚才在一个 iPhone/iPad 应用程序中使用了这种方法。起初我没有使用“performSelector”技术就立即保存,它看起来很好 - 但在阅读文档后我太紧张了(他们说这会导致无限循环),所以我更改为 performSelector 方法,延迟 0.05s .

以上是关于使用 Cocoa 和 Core Data 自动保存的主要内容,如果未能解决你的问题,请参考以下文章

与 Core Data 相关的 Cocoa 错误 19

如何在 Cocoa 文本输入系统中使用 Core Data?

带有命令行界面的 Core Data Cocoa 应用程序

[Cocoa]深入浅出 Cocoa 之 Core Data- 框架详解

Cocoa Touch 从 Core Data 更新 UITableView

带有 Core Data 的 Cocoa pod 在消费应用程序中找不到实体