前台和后台线程的不同ManagedObjectContexts

问题描述:

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

用户可以在运行sync的同时读取/写入数据。我的计划是在应用程序中使用两个managedObjectContext(都使用相同的persistentStoreCoordinator),一个用于前景,另一个用于背景。

我的NSOperations创建的所有后台线程将连续运行,并将使用后台MOC。所有基于UI的东西都将使用前景MOC。

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

非常感谢。

+0

MOC不是线程安全的,因为我知道最好的方法是为每个线程创建单独的MOC。如果你用这样我不认为你会得到任何问题.. – sachin 2012-07-20 13:37:02

+0

我已经在下面添加了一个答案,不知道你是否看到过它? – 2012-07-26 09:04:26

这是一种常见的核心数据模式,并且一个框架被设计为适应。

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

除了线程限制之外,iOS 5.0中还有一些新功能可以帮助管理并发性。 NSManagedObjectContext现在可以配置为NSManagedObjectContextConcurrencyType。您可以选择NSMainQueueConcurrencyTypeNSPrivateQueueConcurrencyType

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

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

这些新功能在文档中没有详细讨论,“iOS v5.0核心数据发行说明”部分提供了一些信息。但是,WWDC 2012会议视频中有更深入的讨论:“会议214 - 核心数据最佳实践”。