在它的核心,我的应用程序将询问用户一堆数字,通过核心数据存储它们,然后我的应用程序负责向用户显示所有这些数字的平均值。
所以我想我应该做的是,在用户输入一个新号码后,我可以启动一个新线程,获取NSFetchDescription
实例中的所有对象并在NSManagedObjectContext
上调用它,进行正确的计算,然后更新主线程上的UI。
我知道Core Data中的并发规则是每个NSManagedObjectContext
实例的一个线程,所以我想知道的是,我认为我刚刚描述的是没有让我的应用程序在5个月内爆炸这条线?我只是不认为有必要实例化一个新的上下文只是为了进行一些细微的计算...
答案 0 :(得分:0)
根据您所描述的内容,为什么不将这些数字存储在CoreData
模型中,还存储到NSMutableArray
?看起来好像存储了这些用于将来检索,以防有人需要查看(并且可能修改)先前的计算。在这种情况下,在输入当前数字集之后无需进行提取。只需使用一个可变数组,并用当前计算的所有数字填充它。输入数字后,将其保存到模型和数组中。当用户准备好查看平均值时,请对已填充的数组中的数字进行数学运算。如果用户想要修改先前的计算,请将这些数字检索到数组中并从那里开始工作。
最重要的是,您不需要使用多个线程并合并Context
,除非您从大型数据集填充模型(如电话簿的初始播种等)。修改Context
并在该上下文上调用save对于您所描述的如此小的更改来说是一件非常快速的事情。
答案 1 :(得分:0)
我想说你可能想做一些测试,特别是关于数据集的大小。如果它非常小,那么sqlite调用非常快,所以你可以放弃在主队列上进行操作。但如果它需要一些时间,那么将它从主线程中删除是明智的。
Apple在2011年引入了父母和子管理对象上下文的概念,以便更轻松地在不同线程上使用MO上下文。您可能想查看核心数据上的WWDC视频。
你可以使用NSExpression获取真正的高性能函数,如min,max,average等。这里有一个很好的链接。 SO上有例子
http://useyourloaf.com/blog/2012/01/19/core-data-queries-using-expressions.html
祝你好运!