3

我有一些从 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];
4

1 回答 1

0

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

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

具体来说,我们每天要查询大约 25 个指标;导致提交 250 个查询。该工作负载都在异步块中,因此在提交锻炼查询后仍在继续;这使它看起来需要很长时间。

解决方案不是每天查询,而是对多天进行一次查询,返回按天分组的结果 - 如下所示:Get total step count for each date in HealthKit

大修的一部分还涉及更好地使用 GCD 组来管理整体任务的完成,并使用组进入和组离开功能跟踪各种未完成的呼叫。这两个变化大大改善了事情。

于 2016-02-08T21:50:44.697 回答