我们的健身应用程序使用三个锚定对象查询来传输心率,活跃卡路里和距离;直到几个星期前,当我们开始优化应用程序的其余性能时,它才能正常工作,以便更好地响应并查询过去锻炼的样本。我们相信我们已经将查询恢复到以前的状态,并且我们有非常相似的代码但是使用Swift编写的单独的健身应用程序正常工作,但是这些HKAnchoredObjectQuerys在返回后没有返回更多结果。处理初始结果(是的,锻炼会话有效)。我们有点难过。任何人都可以看看并建议我们可能出错的地方吗?
谢谢!
以下是心率查询的一个示例:
- (HKQuery*) createHeartRateStreamingQuery: (NSDate *) workoutStartDate {
NSPredicate * predicate = [HKQuery predicateForSamplesWithStartDate:workoutStartDate endDate:nil options:HKQueryOptionNone];
HKQueryAnchor *anchor = HKAnchoredObjectQueryNoAnchor;
if (_HRAnchor) {
anchor = _HRAnchor;
}
HKQuantityType * quantityType = [HKObjectType quantityTypeForIdentifier:HKQuantityTypeIdentifierHeartRate];
HKAnchoredObjectQuery *query =
[[HKAnchoredObjectQuery alloc]
initWithType:quantityType
predicate:predicate
anchor:anchor
limit:HKObjectQueryNoLimit
resultsHandler:^(HKAnchoredObjectQuery * query,
NSArray<HKSample *> * sampleObjects,
NSArray<HKDeletedObject *> * deletedObjects,
HKQueryAnchor * newAnchor,
NSError * error) {
if (error) {
NSLog(@"*** %s An error occured while performing the heartrate anchored object query. %@ ***",
__PRETTY_FUNCTION__, error.localizedDescription);
abort();
} else {
if (newAnchor) {
_HRAnchor = newAnchor;
NSLog(@"*** %s: %i samples returned for startDate %@ ***", __PRETTY_FUNCTION__, sampleObjects.count, workoutStartDate);
for (HKQuantitySample *sample in sampleObjects) {
[self updateHeartRate:sample];
}
for (HKDeletedObject *sample in deletedObjects) {
// [self removeHRSamples: sample]; //not using this for now
}
}
}
}];
return query;
}
- (void) updateHeartRate: (HKQuantitySample *) HRSample {
NSLog(@"%s: %@", __PRETTY_FUNCTION__, HRSample);
[_workoutHRSamplesArray addObject: HRSample];
}
答案 0 :(得分:5)
要使用HKAnchoredObjectQuery
流式传输样本,必须在查询中设置updateHandler
属性。您提供给初始化程序的结果处理程序仅针对与您的查询匹配的现有样本运行一次。