iOS: using GCD with Core Data



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

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

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

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

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

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

Apple在2011年引入了父和子托管对象上下文的概念,以便在不同线程上更容易使用MO上下文。你可以看看Core Data上的WWDC视频。

你可以在fetch中使用NSExpression来获得非常高性能的函数,比如min, max, average等,这里有一个很好的链接。SO

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

祝你好运!

最新更新