HKStatisticsCollectionQuery
Наследование
Оператор импорта
Swift
import HealthKit
Objective C
@import HealthKit;
Доступность
Доступный в iOS 8.0 и позже.
Запрос набора статистики позволяет Вам выполнить многократные запросы статистики по серии временных интервалов фиксированной длины. Например, Вы могли бы создать запрос набора статистики, вычисляющий общее количество шагов на каждый день или средней частоты пульса на каждый час. Запросы набора статистики часто используются для создания данных для графиков и диаграмм. Когда соответствующие выборки добавлены к или удалены из хранилища HealthKit, как запросы наблюдателя, запросы набора могут также получить обновления.
Запросы набора статистики используют точку привязки и временной интервал для разделения набора соответствия выборок в наборы. Точка привязки определяет произвольную начальную точку. Позиция этой точки часто не имеет значения. Это могло быть в будущем или в прошлом. Временные интервалы расширятся далеко от этой точки привязки в обоих направлениях.
Например, когда каждый набор начинается, при использовании интервала с 1 дневным временем точка привязки определяет время. Точная дата точки привязки не имеет значения. Это могло быть 3:34, 1 января 1970 или 3:34, 15 марта 2065. В обоих случаях запрос набора статистики делит соответствующие выборки в дни, запускаясь каждый день в 3:34.
Можно использовать запросы набора статистики только с выборками количества. Если Вы хотите вычислить статистику по проверкам или выборкам корреляции, необходимо выполнить надлежащий запрос и обработать данные сами.
Запросы набора статистики являются главным образом неизменными. Можно присвоить запрос initialResultsHandler
и statisticsUpdateHandler
свойства после инстанцирования объекта. Все другие свойства должны быть установлены, когда Вы инстанцируете объекта, и они не могут измениться.
Для получения дополнительной информации о запросах статистики, посмотрите Ссылку класса HKStatisticsQuery.
Выполнение запросов статистики
Вы создаете демонстрационный запрос путем вызова initWithQuantityType:quantitySamplePredicate:options:completionHandler:
инициализатор. После того, как запрос инстанцируют, Вы выполняете его путем вызова медицинского хранилища executeQuery:
метод. Этот метод выполняет запрос на анонимной очереди фоновых задач. Когда запрос завершен, он выполняет обработчик результатов на той же очереди фоновых задач (но не обязательно на том же потоке). Как правило, Вы диспетчеризируете эти результаты назад основной очереди для обновления пользовательского интерфейса.
Пример кода перечисления 1 показывает, как создать запрос набора статистики и обработать результаты.
Swift
let calendar = NSCalendar.currentCalendar()
let interval = NSDateComponents()
interval.day = 7
// Set the anchor date to Monday at 3:00 a.m.
let anchorComponents =
calendar.components(.CalendarUnitDay | .CalendarUnitMonth |
.CalendarUnitYear | .CalendarUnitWeekday, fromDate: NSDate())
let offset = (7 + anchorComponents.weekday - 2) % 7
anchorComponents.day -= offset
anchorComponents.hour = 3
let anchorDate = calendar.dateFromComponents(anchorComponents)
let quantityType =
HKObjectType.quantityTypeForIdentifier(HKQuantityTypeIdentifierStepCount)
// Create the query
let query = HKStatisticsCollectionQuery(quantityType: quantityType,
quantitySamplePredicate: nil,
options: .CumulativeSum,
anchorDate: anchorDate,
intervalComponents: interval)
// Set the results handler
query.initialResultsHandler = {
query, results, error in
if error != nil {
// Perform proper error handling here
println("*** An error occurred while calculating the statistics: \(error.localizedDescription) ***")
abort()
}
let endDate = NSDate()
let startDate =
calendar.dateByAddingUnit(.MonthCalendarUnit,
value: -3, toDate: endDate, options: nil)
// Plot the weekly step counts over the past 3 months
results.enumerateStatisticsFromDate(startDate, toDate: endDate) {
statistics, stop in
if let quantity = statistics.sumQuantity() {
let date = statistics.startDate
let value = quantity.doubleValueForUnit(HKUnit.countUnit())
self.plotData(value, forDate: date)
}
}
}
healthStore.executeQuery(query)
Objective C
NSCalendar *calendar = [NSCalendar currentCalendar];
NSDateComponents *interval = [[NSDateComponents alloc] init];
interval.day = 7;
// Set the anchor date to Monday at 3:00 a.m.
NSDateComponents *anchorComponents =
[calendar components:NSCalendarUnitDay | NSCalendarUnitMonth |
NSCalendarUnitYear | NSCalendarUnitWeekday fromDate:[NSDate date]];
NSInteger offset = (7 + anchorComponents.weekday - 2) % 7;
anchorComponents.day -= offset;
anchorComponents.hour = 3;
NSDate *anchorDate = [calendar dateFromComponents:anchorComponents];
HKQuantityType *quantityType =
[HKObjectType quantityTypeForIdentifier:HKQuantityTypeIdentifierStepCount];
// Create the query
HKStatisticsCollectionQuery *query =
[[HKStatisticsCollectionQuery alloc]
initWithQuantityType:quantityType
quantitySamplePredicate:nil
options:HKStatisticsOptionCumulativeSum
anchorDate:anchorDate
intervalComponents:interval];
// Set the results handler
query.initialResultsHandler =
^(HKStatisticsCollectionQuery *query, HKStatisticsCollection *results, NSError *error) {
if (error) {
// Perform proper error handling here
NSLog(@"*** An error occurred while calculating the statistics: %@ ***",
error.localizedDescription);
abort();
}
NSDate *endDate = [NSDate date];
NSDate *startDate = [calendar
dateByAddingUnit:NSCalendarUnitMonth
value:-3
toDate:endDate
options:0];
// Plot the weekly step counts over the past 3 months
[results
enumerateStatisticsFromDate:startDate
toDate:endDate
withBlock:^(HKStatistics *result, BOOL *stop) {
HKQuantity *quantity = result.sumQuantity;
if (quantity) {
NSDate *date = result.startDate;
double value = [quantity doubleValueForUnit:[HKUnit countUnit]];
[self plotData:value forDate:date];
}
}];
};
[self.healthStore executeQuery:query];
Выборка в Перечислении 1 демонстрирует, как вычислить общие количества шага на неделю с помощью запроса набора статистики. Этот код запускается путем создания 1-недельного временного интервала. Затем, это назначает дату привязки к утру понедельника в 3:00. Поскольку интервал 1 неделя длиной, точная дата привязки не имеет значения. Каждый набор статистики представляет точно 1 неделю, запускающуюся в понедельник в 3:00.
Затем, выборка создает тип количества для количеств шага и затем создает сам запрос. В отличие от того, как Вы создаете другие запросы, Вы не устанавливаете блок обратного вызова при инстанцировании запроса набора статистики. Вместо этого можно или установить начальный обработчик результата или обработчик обновления статистики (или оба) по мере необходимости для приложения. В этом случае пример кода просто устанавливает начальный обработчик результатов, позволяя ему вычислить статистику по выборкам, в настоящее время сохраненным в HealthKit.
В блоке обработчика результата, проверки кода, чтобы видеть, произошла ли ошибка. Если это не находит ошибку, это вычисляет запуск и время окончания для 3-месячного окна и затем выполняет итерации все время интервалов в том окне. Набор статистики передает блок перечисления объект статистики для каждого временного интервала между запуском и даты окончания. Однако, если временной интервал не содержит выборок, предоставленная статистика sumQuantity
возвраты метода nil
. Поэтому выборка должна проверить, чтобы видеть, имеет ли она допустимое количество. Если это делает, это графически изображает данных; иначе, это просто пропускает тот временной интервал.
Так как мы не обеспечивали, обновление заканчивается обработчик, когда начальный блок результатов сделан, обработав данные, запрос останавливается автоматически. Если бы мы предоставили менеджеру по обновлению, запрос набора статистики продолжал бы контролировать хранилище HealthKit после того, как это генерировало начальные результаты.
После того, как выборка определяет блок обработчика результата, запрос завершен. Пример кода просто выполняет этот запрос с помощью хранилища HealthKit.
-
init (quantityType:quantitySamplePredicate:options:anchorDate:intervalComponents:) - initWithQuantityType:quantitySamplePredicate:options:anchorDate:intervalComponents:
Инициализирует запрос набора статистики для выполнения указанных вычислений по ряду временных интервалов.
Объявление
Swift
init!(quantityType
quantityType
: HKQuantityType!, quantitySamplePredicatequantitySamplePredicate
: NSPredicate!, optionsoptions
: HKStatisticsOptions, anchorDateanchorDate
: NSDate!, intervalComponentsintervalComponents
: NSDateComponents!)Objective C
- (instancetype)initWithQuantityType:(HKQuantityType *)
quantityType
quantitySamplePredicate:(NSPredicate *)quantitySamplePredicate
options:(HKStatisticsOptions)options
anchorDate:(NSDate *)anchorDate
intervalComponents:(NSDateComponents *)intervalComponents
Параметры
quantityType
Тип выборки для поиска. Этот тип должен быть экземпляром
HKQuantityType
класс. Вы не можете выполнить запросы набора статистики с помощью других демонстрационных типов.quantitySamplePredicate
Предикат, ограничивающий результаты, возвращенные запросом. Можно передать
nil
если Вы хотите выполнить статистическое вычисление по всем выборкам указанного типа.options
Список опций, определяющих тип статистических выполняемых вычислений и путь, которым объединяются данные из многократных источников. Для списка допустимых опций посмотрите
HKStatisticsOptions
.anchorDate
Дата раньше привязывала временные интервалы набора. Используйте этот параметр для установки времени начала для временных интервалов. Например, при использовании дневного интервала Вы могли бы создать объект даты со временем 2:00. Это наборы значений запуск дня для каждого из Ваших временных интервалов.
Технически, привязка устанавливает время начала для единственного временного интервала. Все другие временные интервалы должны выровняться с этим интервалом. Временные интервалы могут расшириться прежде или после даты привязки. Каждый временной интервал имеет ту же длину, и между смежными интервалами нет никакого разрыва. Думайте о времени как о числовой оси: дата привязки представляет свой источник с интервалами, создающими метки, расширяющиеся далеко от источника в обоих направлениях.
intervalComponents
Компоненты даты, определяющие временной интервал для каждого объекта статистики в наборе. Для набора демонстрационных временных интервалов см. Перечисление 2.
Возвращаемое значение
Недавно инициализированный набор статистики запрашивает объект.
Обсуждение
После того, как Вы инстанцируете запроса, устанавливаете один или оба из обработчиков обратного вызова, и затем вызываете
HKHealthStore
классexecuteQuery:
метод для выполнения его. Запросы работают на анонимной очереди фоновых задач. Как только запрос завершен, начальный обработчик результатов выполняется на той же очереди фоновых задач (но не обязательно на том же потоке). Вы обычно диспетчеризируете эти результаты основной очереди обновить пользовательский интерфейс.Запросы набора статистики могут также действовать как продолжительные запросы. Если Вы присваиваете обработчик обновления статистики, они продолжают контролировать хранилище HealthKit после сбора начальных результатов. Обработчик обновления статистики вызывают на очереди фоновых задач каждый раз, когда соответствующая выборка сохраняется к Хранилищу HealthKit. Можно отменить этот запрос путем вызова хранилища
stopQuery:
метод.Оператор импорта
Objective C
@import HealthKit;
Swift
import HealthKit
Доступность
Доступный в iOS 8.0 и позже.
-
initialResultsHandler
СвойствоОбработчик результатов для начальных результатов этого запроса.
Объявление
Swift
var initialResultsHandler: ((HKStatisticsCollectionQuery!, HKStatisticsCollection!, NSError!) -> Void)!
Objective C
@property(nonatomic, copy) void (^initialResultsHandler)( HKStatisticsCollectionQuery *query, HKStatisticsCollection *result, NSError *error)
Обсуждение
Если это свойство не установлено в
nil
, запрос выполняет обработчик результатов на очереди фоновых задач после того, как это закончило вычислять статистику для всех выборок соответствия, в настоящее время сохраненных в HealthKit.Оператор импорта
Objective C
@import HealthKit;
Swift
import HealthKit
Доступность
Доступный в iOS 8.0 и позже.
См. также
-
statisticsUpdateHandler
СвойствоОбработчик результатов для контроля обновлений к хранилищу HealthKit.
Объявление
Swift
var statisticsUpdateHandler: ((HKStatisticsCollectionQuery!, HKStatistics!, HKStatisticsCollection!, NSError!) -> Void)!
Objective C
@property(nonatomic, copy) void (^statisticsUpdateHandler)( HKStatisticsCollectionQuery *query, HKStatistics *statistics, HKStatisticsCollection *collection, NSError *error)
Обсуждение
Если это свойство установлено в
nil
, запрос набора статистики автоматически остановится, как только он закончил вычислять начальные результаты. Если это свойство неnil
, запрос ведет себя так же к запросу наблюдателя. Это продолжает работать, контролируя хранилище HealthKit. Если какие-либо новые, соответствующие выборки сохраняются к хранилищу — или если какая-либо из существующих выборок соответствия удалена из хранилища — запрос выполняет обработчик обновления на очереди фоновых задач.Оператор импорта
Objective C
@import HealthKit;
Swift
import HealthKit
Доступность
Доступный в iOS 8.0 и позже.
-
anchorDate
СвойствоДата привязки временных интервалов набора. (только для чтения)
Объявление
Swift
var anchorDate: NSDate! { get }
Objective C
@property(readonly, strong) NSDate *anchorDate
Обсуждение
Дата раньше привязывала временные интервалы набора.
Используйте дату привязки для установки времени начала для временных интервалов. Например, при использовании дневного интервала Вы могли бы создать объект даты со временем 2:00. Это наборы значений запуск каждого дня для всех Ваших временных интервалов.
Технически, привязка устанавливает время начала для единственного временного интервала. Все другие временные интервалы должны выровняться с этим интервалом. Временные интервалы могут расшириться прежде или после даты привязки. Каждый временной интервал имеет ту же длину, и между смежными интервалами нет никакого разрыва. Думайте о времени как о числовой оси: дата привязки представляет свой источник с интервалами, создающими метки, расширяющиеся далеко от источника в обоих направлениях.
Оператор импорта
Objective C
@import HealthKit;
Swift
import HealthKit
Доступность
Доступный в iOS 8.0 и позже.
-
intervalComponents
СвойствоКомпоненты даты, определяющие временной интервал для каждого объекта статистики в наборе. (только для чтения)
Объявление
Swift
@NSCopying var intervalComponents: NSDateComponents! { get }
Objective C
@property(readonly, copy) NSDateComponents *intervalComponents
Обсуждение
Это свойство определяет длину временных интервалов для Вашего набора. Перечисление 2 показывает много общих временных интервалов.
Swift
let fiveMinutes = NSDateComponents()
fiveMinutes.minute = 5
let hour = NSDateComponents()
hour.hour = 1
let day = NSDateComponents()
day.day = 1
let week = NSDateComponents()
week.day = 7
let month = NSDateComponents()
month.month = 1
let year = NSDateComponents()
year.year = 1
Objective C
NSDateComponents *fiveMinutes = [[NSDateComponents alloc] init];
fiveMinutes.minute = 5;
NSDateComponents *hour = [[NSDateComponents alloc] init];
hour.hour = 1;
NSDateComponents *day = [[NSDateComponents alloc] init];
day.day = 1;
NSDateComponents *week = [[NSDateComponents alloc] init];
week.day = 7;
NSDateComponents *month = [[NSDateComponents alloc] init];
month.month = 1;
NSDateComponents *year = [[NSDateComponents alloc] init];
year.year = 1;
Оператор импорта
Objective C
@import HealthKit;
Swift
import HealthKit
Доступность
Доступный в iOS 8.0 и позже.
-
options
СвойствоСписок опций, определяющих тип статистических выполняемых вычислений и путь, которым объединяются данные из многократных источников. (только для чтения)
Объявление
Swift
var options: HKStatisticsOptions { get }
Objective C
@property(readonly) HKStatisticsOptions options
Обсуждение
Для списка допустимых опций посмотрите
HKStatisticsOptions
.Оператор импорта
Objective C
@import HealthKit;
Swift
import HealthKit
Доступность
Доступный в iOS 8.0 и позже.