HKObserverQuery
Оператор импорта
Swift
import HealthKit
Objective C
@import HealthKit;
Доступность
Доступный в iOS 8.0 и позже.
Запросы наблюдателя устанавливают продолжительную задачу на очереди фоновых задач. Эта задача следит за магазином HealthKit и предупреждает Вас, что каждый раз, когда соответствие данных сохранено к или удалено из хранилища. Запросы наблюдателя позволяют Вашему приложению реагировать на изменения, сделанные другими приложениями и устройствами.
Запросы наблюдателя являются неизменными: Их свойства установлены, когда они сначала создаются, и они не могут измениться.
Используя запросы наблюдателя
Вы создаете запрос наблюдателя путем вызова initWithSampleType:predicate:updateHandler:
инициализатор. После того, как запрос инстанцируют, Вы выполняете его путем вызова хранилища HealthKit executeQuery:
метод. Запросы наблюдателя являются продолжительными задачами. Они продолжают работать на анонимном фоновом потоке, вызывая их обработчик результатов каждый раз, когда изменяются данные, соответствующие запрос. Для остановки запроса вызовите хранилище HealthKit stopQuery:
метод.
Пример кода в Перечислении 1 создает запрос наблюдателя, реагирующий на изменения к количеству шага пользователя.
Swift
let sampleType =
HKObjectType.quantityTypeForIdentifier(HKQuantityTypeIdentifierStepCount)
let query = HKObserverQuery(sampleType: sampleType, predicate: nil) {
query, completionHandler, error in
if error != nil {
// Perform Proper Error Handling Here...
println("*** An error occured while setting up the stepCount observer. \(error.localizedDescription) ***")
abort()
}
// Take whatever steps are necessary to update your app's data and UI
// This may involve executing other queries
self.updateDailyStepCount()
// If you have subscribed for background updates you must call the completion handler here.
// completionHandler()
}
healthStore.executeQuery(query)
Objective C
HKSampleType *sampleType =
[HKObjectType quantityTypeForIdentifier:HKQuantityTypeIdentifierStepCount];
HKObserverQuery *query =
[[HKObserverQuery alloc]
initWithSampleType:sampleType
predicate:nil
updateHandler:^(HKObserverQuery *query,
HKObserverQueryCompletionHandler completionHandler,
NSError *error) {
if (error) {
// Perform Proper Error Handling Here...
NSLog(@"*** An error occured while setting up the stepCount observer. %@ ***",
error.localizedDescription);
abort();
}
// Take whatever steps are necessary to update your app's data and UI
// This may involve executing other queries
[self updateDailyStepCount];
// If you have subscribed for background updates you must call the completion handler here.
// completionHandler();
}];
[self.healthStore executeQuery:query];
Перечисление 1creates запрос наблюдателя, получающий обновления каждый раз, когда изменяются данные количества шага HealthKit. Это запускается путем создания демонстрационного типа для количества шага. Тогда это создает сам запрос. Гарантировать, что этот запрос получает обновления каждый раз, когда любые данные количества шага сохранены к или удалены из хранилища, демонстрационных передач в a nil
предикат. Затем в обработчике обновления пример кода проверяет на ошибки. Если никакие ошибки не найдены, это обновляет ежедневные количества шага.
После того, как блок обработчика обновления определяется, запрос завершен. Пример кода просто выполняет этот запрос с помощью хранилища HealthKit.
Получение фоновых поставок
Приложения могут также зарегистрироваться для получения обновлений в то время как в фоновом режиме путем вызова хранилища HealthKit enableBackgroundDeliveryForType:frequency:withCompletion:
метод. Этот метод регистрирует Ваше приложение для фоновых уведомлений. HealthKit будит Ваше приложение каждый раз, когда новые выборки указанного типа сохраняются к хранилищу. Ваше приложение вызывают самое большее один раз на период времени, определенный частотой, которую Вы указали при регистрации.
Как только Ваше приложение запускается, HealthKit вызывает обработчик обновления для любых запросов наблюдателя, соответствующих недавно сохраненные данные. Если Вы планируете поддержку фоновой поставки, устанавливаете все свои запросы наблюдателя в Вашем делегате приложения application:didFinishLaunchingWithOptions:
метод. Путем установки запросов в application:didFinishLaunchingWithOptions:
, Вы гарантируете, что запросы инстанцируют и готовы использовать, прежде чем HealthKit поставляет обновления.
После того, как Ваши запросы наблюдателя закончили обрабатывать новые данные, необходимо вызвать обработчик завершения обновления. Это позволяет HealthKit знать об успешном получении фоновой поставки.
Для получения дополнительной информации об управлении фоновыми поставками посмотрите Управляющие Фоновые Поставки в Ссылке класса HKHealthStore.
Для получения дополнительной информации о фоновом обработчике завершения поставки посмотрите HKObserverQueryCompletionHandler
.
-
Инстанцирует и возвращает запрос, контролирующий хранилище HealthKit и реагирующий на изменения.
Объявление
Swift
init!(sampleType
sampleType
: HKSampleType!, predicatepredicate
: NSPredicate!, updateHandlerupdateHandler
: ((HKObserverQuery!, HKObserverQueryCompletionHandler!, NSError!) -> Void)!)Objective C
- (instancetype)initWithSampleType:(HKSampleType *)
sampleType
predicate:(NSPredicate *)predicate
updateHandler:(void (^)(HKObserverQuery *query, HKObserverQueryCompletionHandler completionHandler, NSError *error))updateHandler
Параметры
sampleType
Тип выборки для поиска. Этот запрос поддерживает все демонстрационные типы. В частности можно передать любой конкретный подкласс
HKSampleType
класс (HKQuantityType
,HKCategoryType
,HKWorkoutType
, иHKCorrelationType
классы)predicate
Предикат, ограничивающий выборки, соответствующие запросом. Передача
nil
если Вы хотите получить обновления для каждой новой выборки указанного типа.updateHandler
Блок, который вызывают, когда соответствующая выборка сохранена к или удалена из хранилища HealthKit. Этот блок берет следующие параметры:
query
Ссылка на запрос, вызывая этот блок.
completionHandler
Если Вы зарегистрировались для фоновых обновлений, необходимо вызвать этот обработчик завершения, как только Вы сделаны, обработав входящие данные. Это говорит HealthKit об успешном получении фонового обновления. Кроме того, необходимо только вызвать обработчик завершения при использовании фоновых обновлений. Для получения дополнительной информации об использовании этого обработчика завершения посмотрите
HKObserverQueryCompletionHandler
.error
Если ошибка происходит, этот параметр содержит объект, описывающий ошибку; иначе, это
nil
.Возвращаемое значение
Недавно инициализированный наблюдатель запрашивает объект.
Обсуждение
После инстанцирования запроса вызовите
HKHealthStore
классexecuteQuery:
метод для выполнения этого запроса. Запросы наблюдателя являются продолжительными задачами. Они продолжают работать на анонимном фоновом потоке и вызывать их обработчик результатов каждый раз, когда они обнаруживают соответствующие изменения в хранилище HealthKit. Для остановки запроса вызовитеHKHealthStore
классstopQuery:
метод.Предоставленный блок обработчика обновления вызывают каждый раз, когда выборки, соответствующие этот запрос, сохранены к или удалены из хранилища HealthKit. Часто необходимо запускать другие запросы из этого блока для получения обновленных данных. В частности можно использовать Запросы Привязанного объекта для получения списка новых выборок, добавленных к хранилищу. Для получения дополнительной информации посмотрите Ссылку класса HKAnchoredObjectQuery
Оператор импорта
Objective C
@import HealthKit;
Swift
import HealthKit
Доступность
Доступный в iOS 8.0 и позже.
Типы данных
-
Обработчик завершения для фоновых поставок.
Объявление
Swift
typealias HKObserverQueryCompletionHandler = () -> Void
Objective C
typedef void(^HKObserverQueryCompletionHandler)(void);
Обсуждение
Этот обработчик завершения определяет блок, который можно вызвать при ответе на фоновые поставки. Когда новые данные были сохранены к хранилищу HealthKit, если Ваши регистры приложения для фоновых поставок, HealthKit будит Ваше приложение. Можно указать максимальную частоту для фоновых поставок. HealthKit будит Ваше приложение только один раз во время каждого периода времени, определяющегося частотой.
Когда HealthKit будит Ваше приложение, он вызывает обработчик обновления на любых запросах наблюдателя, соответствующих новые данные. Этот блок передается обработчику обновления. Необходимо вызвать этот блок, как только Вы сделаны, обработав входящие данные. Вызов этого блока говорит HealthKit об успешном получении фоновых данных. Если Вы не вызываете этот блок, HealthKit продолжает пытаться запустить Ваше приложение с помощью спины от алгоритма. Если Вашему приложению не удается ответить три раза, HealthKit предполагает, что Ваше приложение не может получить данные и прекращает отправлять Вам фоновые обновления.
Оператор импорта
Objective C
@import HealthKit;
Swift
import HealthKit
Доступность
Доступный в iOS 8.0 и позже.