Запросы о тренировках 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];

person Fiid    schedule 02.02.2016    source источник
comment
Какие еще запросы (примеры запросов, привязанный объект, статистика)?   -  person Allan    schedule 03.02.2016
comment
У меня также сложилось впечатление, что выбор тренировок кажется медленным. Если Алан захочет, я приму. Вероятно, 1-2 секунды на часах, где почти нет данных о тренировках. На 6plus: 1-2 секунды для выбора недавних из примерно 100 тренировок.   -  person Gerd Castan    schedule 05.02.2016


Ответы (1)


Я сделал несколько отдельных запросов о тренировках и обнаружил, что они на самом деле очень быстрые.

Оказалось, что предыдущий этап синхронизации HealthKit вызывал впечатление, что запросы тренировки выполнялись долго.

В частности, мы запрашивали около 25 показателей в день; вызывая отправку примерно 250 запросов. Эта рабочая нагрузка находилась в асинхронных блоках, поэтому продолжалась после того, как запрос тренировки был отправлен; из-за чего казалось, что на это уходит много времени.

Решение заключалось в том, чтобы не запрашивать каждый день, а вместо этого выполнять один запрос в течение многих дней, который возвращает результаты, сгруппированные по дням, например: Получить общее количество шагов для каждой даты в HealthKit

Частично капитальный ремонт также включал улучшение работы с использованием групп GCD для управления завершением общей задачи и отслеживания различных невыполненных вызовов с использованием функций группового входа и выхода из группы. Эти два изменения значительно улучшили ситуацию.

person Fiid    schedule 08.02.2016