我有一些代码正在查询来自healthkit的数据。我们从healthkit以及最近的训练中获得各种样本和数量。在我的手机上(通常是每天锻炼 - 虽然Basis将东西存储为多次锻炼),锻炼查询大约需要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];
答案 0 :(得分:0)
我做了一些孤立的锻炼查询,发现它们实际上非常快。
事实证明,我们的HealthKit同步的前一阶段导致锻炼查询需要很长时间。
具体来说,我们每天查询约25个指标;导致提交250个查询的内容。这个工作量都是异步块,所以在提交锻炼查询后仍然继续;这看起来好像花了很长时间。
解决方案是每天不查询,而是在多天内执行单个查询,返回按天分组的结果 - 如下所示:Get total step count for every date in HealthKit
部分改革还涉及更好地使用GCD组来管理整体任务的完成以及使用group-enter和group-leave功能跟踪各种未完成的呼叫。这两个变化大大改善了事情。