为啥 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 个值?的主要内容,如果未能解决你的问题,请参考以下文章