我是否可以执行单个提取请求,为结果的子集返回独立的计算?



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

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

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

因此,我的问题:是否可以使用 NSExpressions 为每个日期间隔添加类似子谓词的东西,以便执行单个获取请求并检索一个字典,其中包含每个每日 numberOfBiscuits 总和的条目? 如果没有,在这种情况下,建议采用什么方法?

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

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

我认为您正在寻找的是NSFetchRequestpropertiesToGroupBy(请参阅Apple Docs),尽管在您的情况下,实现起来并不简单,原因我将在后面讨论。

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

fetch.propertiesToGroupBy = ["category"]

然后,CoreData 将按category对获取结果进行分组,并分别计算每个组的总和。

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

最好是调整异步提取,或者按照您的建议,将整个批次读入内存以执行计算。 如果您的实体只有这两个属性,并且假设您的用户不完全以饼干为生,则数量应该不会有太大问题。

最新更新