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

Why HKSample array always have 1 value for a HKAnchoredObjectQuery with no limits,no predicate, no anchor?

我想了解 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 个心率读数,这是最新读数。因为我没有在查询上设置任何限制、谓词或锚点,它不应该有自锻炼开始以来的所有心率读数吗?

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

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