我有一些代码正在从healthkit查询数据。我们从保健包以及最近的锻炼中获得各种样本和数量。在我的手机上(通常每天进行一次锻炼-尽管基础将事情存储为多次锻炼),锻炼查询大约需要8秒钟,但所有其他类型的查询都在不到一秒钟的时间内完成。
看起来,这个查询实际上是在进行线性扫描,对其他索引进行索引或其他操作。想知道是否有人遇到了这个问题或有什么想法?
NSPredicate *predicate = [HKQuery predicateForSamplesWithStartDate:[self dateByCalculatingWithNumberOfDays:-1 date:[NSDate date]]
endDate:[NSDate date]
options:HKQueryOptionStrictStartDate | HKQueryOptionStrictEndDate];
NSSortDescriptor *sortDescriptor = [NSSortDescriptor sortDescriptorWithKey:HKSampleSortIdentifierStartDate ascending:NO];
HKSampleQuery *query = [[HKSampleQuery alloc] initWithSampleType:[HKSampleType workoutType]
predicate:predicate
limit:0
sortDescriptors:@[sortDescriptor]
resultsHandler:^(HKSampleQuery *query, NSArray *results, NSError *error) {
self.workoutEntries = [[NSMutableArray alloc] initWithCapacity:results.count];
for (HKWorkout *workout in results) {
WorkoutObject *workoutObject = [WorkoutObject workoutObjectWithWorkout:workout];
[self.workoutEntries addObject:workoutObject];
}
[self fetchHeartRate];
}];
[self.healthStore executeQuery:query];
最佳答案
我做了一些孤立的锻炼查询,发现它们实际上非常快。
事实证明,我们HealthKit同步的前一个阶段似乎导致锻炼查询花费很长时间。
具体来说,我们每天查询约25个指标;导致提交约250条查询。该工作量全部处于异步块中,因此在提交锻炼查询后仍继续进行;看起来好像要花很长时间。
解决方案是每天不查询,而是连续多次查询一次,返回按天分组的结果,例如:Get total step count for every date in HealthKit
检修的一部分还包括更好地利用GCD组来管理整个任务的完成,并使用组输入和组离开功能跟踪各种未完成的 call 。这两个变化大大改善了情况。