ios - 前台和后台线程的不同 ManagedObjectContext

标签 ios core-data nsmanagedobjectcontext nsoperation

我是 iOS 开发新手。我正在编写一个 iOS 应用程序,允许用户读取/写入核心数据记录。这些记录将通过 http 同步到服务器。我有一组链式(串行)NSOperations 在执行同步的后台线程中运行。

用户可以在同步运行的同时进行读/写操作。我的计划是在应用程序中使用两个 ManagedObjectContext(都使用相同的 persistenceStoreCoordinator),一个用于前台,一个用于后台。

由我的 NSOperations 创建的所有后台线程都将串行运行并使用后台 MOC。所有基于 UI 的内容都将使用前台 MOC。

我的问题是:这是可接受的 iOS 核心数据模式吗?我能否愉快地对这两个 MOC 中的同一模型数据库进行读/写操作,而不必担心锁定和并发问题?

非常感谢。

最佳答案

这是一种常见的核心数据模式,框架旨在适应这种模式。

如果您自己管理线程,则需要使用一种称为“线程限制”的技术,您可以在标题为“核心数据并发”的文档中阅读更多相关信息。

除了线程限制之外,iOS 5.0 中还有旨在帮助管理并发的新功能。现在可以使用 NSManagedObjectContextConcurrencyType 配置 NSManagedObjectContext。您可以在 NSMainQueueConcurrencyTypeNSPrivateQueueConcurrencyType 之间进行选择。

具有 NSMainQueueConcurrencyType 的上下文在主线程上运行,可用于为 UI 提供服务。具有 NSPrivateQueueConcurrencyType 的上下文用于后台任务。

要使用私有(private)上下文,您可以通过 performBlock:performBlockAndWait: 方法与其交互,以确保您的代码在正确的线程上执行。要使用主队列上下文,您可以像平常一样与其交互,或者如果您的代码不在主线程上运行,则可以使用 block 方法。

文档中没有详细讨论这些新功能,“iOS v5.0 的核心数据发行说明”部分中有一些信息。然而,WWDC 2012 session 视频中进行了更具洞察力的讨论:“ session 214 - 核心数据最佳实践”。

关于ios - 前台和后台线程的不同 ManagedObjectContext,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11580421/

相关文章:

ios - UICollectionView 上的 DecorationViews 在每次插入时都是重复的

ios - CoreData 教程抛出错误,插入 nil

ios - CoreData - 在后台上下文中删除对象时的不一致行为(附加测试项目)

ios - 在后台线程上执行核心数据保存?

objective-c - 如何创建子 NSManagedObjectContext?

ios - 无法在 iOS 的核心数据中用另一个实体替换一个实体

iOS - 从框架内部访问应用程序包的资源

ios - 如何确保只显示来自 Rest api 的更新数据

objective-c - 核心数据 KVO 计数

ios - 错误 ITMS-90174 : “Missing Provisioning Profile - Apps must contain a provisioning profile in a file named embedded.mobileprovision.”