在后台线程上安全保存 Core Data 托管对象上下文的正确方法?

Posted

技术标签:

【中文标题】在后台线程上安全保存 Core Data 托管对象上下文的正确方法?【英文标题】:Correct approach for safely saving a Core Data managed object context on a background thread? 【发布时间】:2011-04-22 03:48:08 【问题描述】:

Apple "Concurrency with Core Data" documentation 在讨论将核心数据与后台线程一起使用时声明如下。

保存在后台线程容易出错

异步队列和线程不会阻止应用程序 戒烟。 (具体来说,所有基于 NSThread 的线程都是“分离的”——参见 pthread 的文档以获取完整的详细信息 - 并且进程运行 直到所有未分离的线程都退出。)

特别是:

如果您需要在后台线程上保存,您必须编写额外的代码,以便主线程阻止应用程序退出,直到所有保存操作完成。

ios 应用程序中实现此目标的推荐方法是什么?

【问题讨论】:

【参考方案1】:

在应用程序委托applicationWillTerminate和相关方法中,您需要检查是否有任何后台线程有未保存的更改并保存它们,然后才能允许应用程序终止或进入后台。

【讨论】:

+1 对,但请注意“相关方法”包括applicationDidEnterBackground——应用程序可以进入后台,然后在没有任何进一步通知的情况下暂停和终止。 谢谢。我对 IOS 框架内的线程做的不多,您是否有一些示例代码,或者您能否向我指出一些有关如何从应用程序委托类内部访问和检查未保存更改的线程的文档的方向. 一切都取决于你如何真正实现线程。例如,如果您使用的是NSOperationQueue,则waitUntilAllOperationsAreFinished 可能会很有用。【参考方案2】:

我建议使用 Magical Record (https://github.com/magicalpanda/MagicalRecord/)。它极大地简化了在后台线程上处理核心数据。我最近发现了这个并将其用于一个项目。我们现在进行了维护工作,以更新各种现有应用程序以使用新的 Magical Record 核心数据包装器。在我们使用它的几周内,它为我们节省了大量时间和挫败感。

【讨论】:

以上是关于在后台线程上安全保存 Core Data 托管对象上下文的正确方法?的主要内容,如果未能解决你的问题,请参考以下文章

Core Data 3 托管对象上下文

从后台线程使用 Core Data 托管上下文......你如何正确地做到这一点?

Core Data,在后台线程中修改 NSManagedObject

Core Data 使用多个上下文中的新对象从后台线程订购一对多关系保存

Core-Data 后台保存性能问题

如何在通过 Core Data 保存我的 RestKit 托管对象之前对其进行修改?