Статистика за месяц HKQuantityType с кумулятивным стилем агрегации

Мне нужно создать статистику за месяц HKQuantityType с кумулятивным стилем агрегации, как в приложении «Здоровье» в годовом обзоре.

HKStatisticsCollectionQuery может вычислять только сумму для кумулятивных типов.

Как это работает сейчас. Я делаю 12 HKSampleQueries. Каждый квест имеет предикат с датами начала и окончания месяца. Затем я повторяю каждый результат запроса, чтобы вычислить количество дней, в которых есть образцы (один день может содержать более одного образца). По количеству дней готовности я делю сумму мотылей на количество дней.

Основная проблема в том, что если я соберу все образцы за месяц, то у меня получится около 10000 образцов. Число месяцев равно 12, поэтому для одной метрики в год требуется около 120 000 образцов.

Я запускаю его в фоновых потоках, но объем памяти составляет около 180 МБ при расчете среднего за каждый месяц, и для расчета требуется около минуты.

Есть ли возможность получить количество проб в месяц, нащупываемых по дням? Я не нашел решения для этого :(


person artyom    schedule 22.06.2016    source источник
comment
Можете ли вы объяснить более подробно, что вы пытаетесь рассчитать? Мне сложно представить, по какой причине вам может понадобиться найти среднее значение набора кумулятивных образцов.   -  person Allan    schedule 22.06.2016
comment
Я хочу рассчитать среднее значение за месяц для совокупных значений. Для этого мне нужно знать количество образцов за месяц. Затем я могу разделить сумму месяца на количество образцов в месяце. Основная проблема в том, что у нас может быть несколько образцов в день. Я попытался получить все образцы за год в одном запросе и перебрать массив. Но это действительно работает, потому что у нас может быть более 3000 образцов :(   -  person artyom    schedule 24.06.2016
comment
@ Аллан, это ясное объяснение?   -  person artyom    schedule 02.07.2016
comment
Вы хотите получить среднее значение каждой совокупной выборки? Для меня это не имеет особого смысла, поскольку каждый образец может охватывать совершенно разное количество времени (некоторые из них могут составлять 1 минуту, а некоторые - 1 час). Или вы хотите рассчитать среднюю сумму за фиксированное количество времени, например, среднее значение ежедневных сумм за месяц? Было бы полезно, если бы вы более конкретно указали, какой тип данных и какую информацию вы пытаетесь передать пользователю.   -  person Allan    schedule 03.07.2016
comment
Мне нужно среднее значение каждого HKQuantityType с кумулятивным стилем агрегации в HealthKit. Например, мне нужно среднее значение HKQuantityTypeIdentifierBasalEnergyBurned за каждый месяц в прошлом году. Таким образом, это начнется в июле 2015 года, августе 2015 года... июле 2016 года. Затем то же самое для HKQuantityTypeIdentifierStepCount и т. д.   -  person artyom    schedule 04.07.2016
comment
То же, что и для HealthApp на вкладке Year для графиков (Dashboard)   -  person artyom    schedule 04.07.2016
comment
Хорошо понял. Однако расчет этого среднего значения не требует подсчета образцов в месяц. Я объясню дальше в ответ.   -  person Allan    schedule 04.07.2016


Ответы (1)


Попробуйте HKStatisticsCollectionQuery с интервалом в один день. Затем вы можете усреднить возвращаемые суммы за день. Это должно быть на порядки эффективнее, чем запрашивать все выборки в каждом месяце (и более правильно, поскольку вам нужно будет учитывать перекрывающиеся выборки, возвращаемые HKSampleQuery).

person Allan    schedule 04.07.2016
comment
Благодарю вас! Он работает быстрее, чем с SampleQuery. Статистика за 12 месяцев теперь заполняется за 5-7 секунд. Я не думал, что это действительно быстрое решение :) - person artyom; 05.07.2016