带有子上下文的核心数据多线程

Posted

技术标签:

【中文标题】带有子上下文的核心数据多线程【英文标题】:Core data multithreading with children contexts 【发布时间】:2013-11-22 15:50:37 【问题描述】:

我刚刚开始学习核心数据。谈到多线程,一些博客说在这种情况下我们应该使用子上下文(通过创建上下文并设置其父级)并调用 performBlock: 方法。但是其他一些博客说我们应该避免这种方法,因为它引入了许多错误。 我刚刚开始开发一个操作大型数据库的应用程序,项目经理投票支持 Core data(而不是 SQLLite)。 任何人都可以给我一些指导。我应该使用子上下文策略(自 ios 5 开始引入)还是有更好的方法来使用 Core Data 执行多线程? 谢谢。

【问题讨论】:

这个来自苹果的指南应该涵盖正确的方法。 developer.apple.com/library/ios/documentation/cocoa/conceptual/… 感谢您的回答。但是我已经浏览了整个文档,并没有给出关于最佳策略的想法。我只想知道:我应该使用嵌套上下文吗? 如果您查看此链接wbyoung.tumblr.com/post/27851725562/core-data-growing-pains,您会发现它阻碍了我们使用这种新技术(嵌套上下文)。然而,在这个链接cocoanetics.com/2012/07/multi-context-coredata 中,我们被告知并建议使用它。我很困惑。 developer.apple.com/library/content/documentation/Cocoa/… 【参考方案1】:

我应该使用儿童上下文策略吗(从 iOS 5 开始引入) 还是有更好的方法来使用 Core Data 执行多线程?

除了您提到的概念之外,托管对象上下文还具有内置的并发支持,无需父上下文(请参阅https://developer.apple.com/library/ios/releasenotes/DataManagement/RN-CoreData/index.html)。

如果您使用initWithConcurrencyType: 创建一个,您可以使用performBlock:performBlockAndWait: 并且线程将为您处理,假设您遵循上面链接中列出的基本模式。父/子上下文方法可以帮助您进行同步。

这里还概述了一种基于 NSOperation 的方法:http://www.objc.io/issue-2/common-background-practices.html。我个人不会使用它,因为内置的 API 就足够了,但是这篇文章写得很好,应该让你对发生的事情有一个很好的了解。

如何实现这取决于您的应用的需求。

其他一些博客说我们应该避免这种方法,因为它已经 引入了许多错误。

我会忽略它们,并专注于为自己编写干净的代码。有很多应用程序使用多线程 + Core Data 并且没有错误。

【讨论】:

感谢您的回答。我也不想使用基于 NSOperation 的多线程。所以据我从您的回答中了解到,使用嵌套上下文技术没有害处。 没错。避免错误的主要技术是确保您了解并发编程 - 队列和线程如何交互等。如果您是新手,请阅读并发编程指南 (developer.apple.com/library/ios/documentation/General/…)。如果您对这些内容非常了解,我会深入研究并开始使用。 好吧,我对并发编程并不陌生,因为我是 GCD 的忠实粉丝。好吧,我正在考虑您的建议,并且我正在使用嵌套上下文技术,因为我的数据库包含多达 30 000 行并且可能更多(对于单个表)。这使得获取和保存操作非常缓慢并且 UI 阻塞。感谢您的出色回答。我接受并打勾。

以上是关于带有子上下文的核心数据多线程的主要内容,如果未能解决你的问题,请参考以下文章

核心数据多线程和嵌套上下文

核心数据父/子上下文保存失败

核心数据:更新子上下文

Spring @async 子线程上下文多租户

在后台线程中将数据同步到服务器:核心数据中的多个上下文

在 iOS 5 中使用 UIManagedDocument 和父/子上下文导入核心数据背景