iOS:将 GCD 与 Core Data 结合使用

Posted

技术标签:

【中文标题】iOS:将 GCD 与 Core Data 结合使用【英文标题】:iOS: using GCD with Core Data 【发布时间】:2012-12-23 13:07:59 【问题描述】:

在它的核心,我的应用会向用户询问一堆数字,通过核心数据存储它们,然后我的应用负责向用户显示所有这些数字的平均值。

所以我认为我应该做的是,在用户输入一个新数字后,我可以启动一个新线程,获取 NSFetchDescription 实例中的所有对象并在我的 NSManagedObjectContext 上调用它,做正确的事计算,然后在主线程上更新 UI。

我知道 Core Data 中的并发规则是每个 NSManagedObjectContext 实例一个线程,所以我想知道的是,我认为我刚才描述的内容是否可以让我的应用在 5 个月后爆炸?我只是认为没有必要为了做一些微不足道的计算而实例化一个全新的上下文......

【问题讨论】:

我喜欢 Core Data,但如果你保存的只是“一堆数字”,那它可能是错误的工具......特别是如果你除了 fetch all 没有对它们做任何事情(和商店)。 【参考方案1】:

根据您所描述的,为什么不将输入到CoreData 模型和NSMutableArray 中的数字存储起来?似乎您正在存储这些以备将来检索,以防有人需要查看(并且可能修改)先前的计算。在这种情况下,输入当前的一组数字后,无需进行提取。只需使用一个可变数组并用当前计算的所有数字填充它。输入数字后,将其保存到模型和数组中。当用户准备好查看平均值时,对已填充数组中的数字进行数学运算。如果用户想要修改之前的计算,请将这些数字检索到一个数组中并从那里开始工作。

底线是您不需要使用多个线程并合并Contexts,除非您从大型数据集中填充模型(例如电话簿的初始播种等)。修改 Context 并在该上下文上调用 save 对于您所描述的如此小的更改来说是一件非常快的事情。

【讨论】:

【参考方案2】:

我想说您可能想做一些测试,尤其是关于数据集的大小。如果它非常小,则 sqlite 调用非常快,因此您可以在主队列中进行操作。但如果需要一些时间,那么明智的做法是将其从主线程中移除。

Apple 在 2011 年引入了父子托管对象上下文的概念,以便更轻松地在不同线程上使用 MO 上下文。您可能想查看有关 Core Data 的 WWDC 视频。

您可以在 fetch 中使用 NSExpression 来获得真正高性能的函数,例如最小值、最大值、平均值等。这是一个很好的链接。 SO上有例子

http://useyourloaf.com/blog/2012/01/19/core-data-queries-using-expressions.html

祝你好运!

【讨论】:

以上是关于iOS:将 GCD 与 Core Data 结合使用的主要内容,如果未能解决你的问题,请参考以下文章

iOS 上 Core Data 结合 FMDB

带有 Core Data 陡峭学习曲线的 RestKit 0.10.1

Swift之深入解析如何结合Core Data和SwiftUI

使用 GCD 和 Core Data 会导致崩溃

iOS - 如何使用 Core Data 将 2 个实体迁移到 1 个?

iOS开发-NSOperation与GCD区别