HealthKit锻炼查询似乎很慢

时间:2016-02-02 21:30:07

标签: ios ios9 health-kit hkhealthstore hksamplequery

我有一些代码正在查询来自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];

1 个答案:

答案 0 :(得分:0)

我做了一些孤立的锻炼查询,发现它们实际上非常快。

事实证明,我们的HealthKit同步的前一阶段导致锻炼查询需要很长时间。

具体来说,我们每天查询约25个指标;导致提交250个查询的内容。这个工作量都是异步块,所以在提交锻炼查询后仍然继续;这看起来好像花了很长时间。

解决方案是每天不查询,而是在多天内执行单个查询,返回按天分组的结果 - 如下所示:Get total step count for every date in HealthKit

部分改革还涉及更好地使用GCD组来管理整体任务的完成以及使用group-enter和group-leave功能跟踪各种未完成的呼叫。这两个变化大大改善了事情。