为啥 HKSample 数组对于一个没有限制、没有谓词、没有锚点的 HKAnchoredObjectQuery 总是有 1 个值?

Posted

技术标签:

【中文标题】为啥 HKSample 数组对于一个没有限制、没有谓词、没有锚点的 HKAnchoredObjectQuery 总是有 1 个值?【英文标题】:Why HKSample array always have 1 value for a HKAnchoredObjectQuery with no limits,no predicate, no anchor?为什么 HKSample 数组对于一个没有限制、没有谓词、没有锚点的 HKAnchoredObjectQuery 总是有 1 个值? 【发布时间】:2016-04-03 11:16:37 【问题描述】:

我正在尝试了解 HKAnchoredObjectQuery 的工作原理。一旦锻炼开始并且锻炼会话状态变为正在运行,我调用以下函数来执行查询并获取心跳值。

func createHeartRateStreamingQuery() 

   guard let quantityType = HKObjectType.quantityTypeForIdentifier(HKQuantityTypeIdentifierHeartRate) else  return nil 

    var heartRateQuery : HKAnchoredObjectQuery? = HKAnchoredObjectQuery(type: quantityType, predicate: nil, anchor: nil, limit: Int(HKObjectQueryNoLimit))  (query, sampleObjects, deletedObjects, newAnchor, error) -> Void in

    

    heartRateQuery!.updateHandler = (query, samples, deleteObjects, newAnchor, error) -> Void in
        
           //Samples only have 1 entry which is the most recent reading.
        
    

    self.healthStore.executeQuery(heartRateQuery!)


HeartRateQuery 的更新处理程序每​​ 2 到 3 秒调用一次,并且完成处理程序中的示例变量只有 1 次心率读数,这是最新的读数。由于我没有在查询上设置任何限制、谓词或锚点,它不应该包含自锻炼开始以来的所有心率读数吗?

【问题讨论】:

【参考方案1】:

您看到的行为是预期的。 updateHandler 仅使用自上次调用处理程序以来的新样本调用。如果您想跟踪锻炼期间记录的样本,则应在每次调用处理程序时将它们添加到数组中。

请注意,由于您没有使用谓词,初始结果块将包括 HealthKit 当前可用的所有心率样本,而不仅仅是锻炼期间记录的样本。您可能应该使用日期谓词来限制查询,以仅获取您感兴趣的样本。

【讨论】:

是的,我注意到更新处理程序只返回最近的条目,初始结果块将包括所有心率样本。我现在使用从上次更新处理程序获得的锚点而不是日期,来获取应用程序暂停时记录的所有样本

以上是关于为啥 HKSample 数组对于一个没有限制、没有谓词、没有锚点的 HKAnchoredObjectQuery 总是有 1 个值?的主要内容,如果未能解决你的问题,请参考以下文章

为啥更改数组的顺序会导致超出时间限制?

为啥 C# 数组仍然限制在约 21 亿个元素中

为啥 Java 没有真正的多维数组?

为啥我的查询没有返回枚举数组

将 HKSample 与另一个 HKSample 进行比较以防止重复

将 HKSample 与另一个 HKSample 进行比较以防止重复