2016-04-03 49 views
0

我想了解HKAnchoredObjectQuery的工作原理。锻炼开始并且锻炼会话状态更改为运行后,我会调用以下函数来执行查询并获取心跳值。为什么HKSample数组对于HKAnchoredObjectQuery总是有1个值,没有限制,没有谓词,没有锚点?

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中当前可用的所有心率采样,而不仅仅是锻炼会话期间记录的采样。你应该用日期谓词来约束查询,以获得你感兴趣的样本。

+0

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