HealthKit 锻炼查询似乎真的很慢

Posted

技术标签:

【中文标题】HealthKit 锻炼查询似乎真的很慢【英文标题】:HealthKit Workout Queries seem really slow 【发布时间】:2016-02-02 21:30:07 【问题描述】:

我有一些从 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-2 秒。在 6plus 上:1-2 秒选择最近的大约 100 次锻炼。 【参考方案1】:

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

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

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

解决方案不是每天查询,而是在多天内执行一次查询,返回按天分组的结果 - 像这样:Get total step count for every date in HealthKit

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

【讨论】:

以上是关于HealthKit 锻炼查询似乎真的很慢的主要内容,如果未能解决你的问题,请参考以下文章

HealthKit -> 查询附有路线的锻炼

iOS Healthkit 记录自定义锻炼数据

iOS Healthkit 记录自定义锻炼数据

您如何使用 HealthKit 检测锻炼开始/停止?

在后台访问 healthkit 锻炼

在后台访问 healthkit 锻炼