0

我的数据模型有一个 ClickerRecord 实体,它有 2 个属性:date ( NSDate) 和 numberOfBiscuits ( NSNumber)。每次添加新记录时,都可以输入不同的 numberOfBiscuits 值。

为了计算饼干数量的每日平均值,我目前正在范围内的每一天执行获取请求,并使用相应NSExpression的来计算当天所有 numberOfBiscuits 值的总和。

问题:我使用异步获取请求来避免阻塞主线程,所以当第一条记录和最后一条记录之间有很多天时,它最终会变得很慢。获取请求一个接一个地执行。我也可以将所有记录加载到内存中并执行排序和计算,但我担心当记录数量变得非常大时它可能会成为问题。

因此,我的问题是:是否可以使用 NSExpressions 为每个日期间隔添加类似子谓词的内容,以便执行单个提取请求并检索字典,其中包含每个每日 numberOfBiscuits 总和的条目?如果不是,对于这种情况,推荐的方法是什么?

我已经阅读了有关子查询的信息,但据我所知,它们不适用于这种用途。

这是我在 SO 上提出的第一个问题,所以我希望以清晰的方式写出来:)

4

1 回答 1

1

我认为您正在寻找的是propertiesToGroupBy(请参阅Apple DocsNSFetchRequest,尽管在您的情况下它不是直接实施的,原因我将在稍后讨论。

假设您可以指定每次消费的饼干类别,并将其存储在category您的实体的属性中。然后要获得每个类别的饼干总数(忽略日期),您可以使用NSExpressionusing@sum并指定:

fetch.propertiesToGroupBy = ["category"]

然后,CoreData 将 fetch 的结果分组,category并分别计算每个组的总和。

您的情况的问题是(除非您已经从date属性中删除了时间信息),没有代表您想要分组的日期间隔的属性,CoreData 不会让您指定计算值来分组. 您需要向day您的实体添加一个新属性,并在添加/更新记录时计算该属性,并在分组依据中指定它。如果您随后想在不同的时间间隔(例如几周或几个月)计算平均值,您将再次面临同样的问题。另一个缺点是结果将只days包括ClickerRecords:如果用户有一天没有吃饼干,那么获取将不会显示当天的结果(即它不会推断出平均值为 0)。在使用结果时,您需要适当地处理这个问题。

调整异步获取可能会更好,或者按照您的建议,将全部内容读入内存以执行计算。如果您的实体只有这两个属性,并且假设您的用户并非完全靠饼干为生,那么数量应该不会太成问题。

于 2016-06-22T09:11:34.300 回答