HKCorrelationQuery
Оператор импорта
Swift
import HealthKit
Objective C
@import HealthKit;
Доступность
Доступный в iOS 8.0 и позже.
HealthKit использует запросы корреляции для поиска корреляций в хранилище HealthKit. Корреляция является контейнером, группирующимся много количеств или выборок категории. Используйте запросы корреляции для выполнения сложных поисков HKCorrelation
объекты.
В то время как можно использовать демонстрационные запросы для поиска корреляций, запросы корреляции позволяют более сложную фильтрацию содержавших данных. В частности эти запросы позволяют Вам обеспечить отдельный предикат для каждого из демонстрационных типов, сохраненных в корреляции. Корреляция возвращается, только если соответствуют предикат корреляции и все его демонстрационные предикаты.
Запрос разрешения совместно использовать и читать
В отличие от других демонстрационных типов, Вы не запрашиваете разрешение совместно использовать и считать типы корреляции непосредственно. Вместо этого Вы запрашиваете разрешение совместно использовать и считать каждый из демонстрационных типов, содержавших в корреляции.
При сохранении корреляции приложение должно иметь разрешение совместно использовать все содержащие в нем объекты. Если приложение не имеет разрешения совместно использовать один или больше содержащих в нем объектов, сбои работы.
Когда Ваши запросы приложения для данных корреляции, HealthKit только возвращает выборки, содержащие объекты, у Вас есть разрешение читать. Если приложение имеет разрешение к только для чтения некоторые содержащие в нем объекты, HealthKit все еще возвращает корреляцию; однако, корреляция, кажется, только содержит те объекты, которые Ваше приложение имеет разрешение считать. HealthKit скрывает все другие содержащие в нем объекты из Вашего приложения.
Выполнение запросов
Вы создаете запрос корреляции путем вызова initWithType:predicate:samplePredicates:completion:
инициализатор. После того, как запрос инстанцируют, Вы выполняете его путем вызова хранилища HealthKit executeQuery:
метод. Этот метод выполняет запрос на анонимной очереди фоновых задач. Когда запрос завершен, он выполняет обработчик результатов на той же очереди фоновых задач (хотя не обязательно тот же поток). Как правило, Вы диспетчеризируете эти результаты назад основному потоку для обновления пользовательского интерфейса.
Перечисление 1 создает запрос корреляции, ищущий продовольственные выборки больше чем с 800 калориями.
Swift
var highCalorieFoods: [HKCorrelationQuery] = []
let highCalorie = HKQuantity(unit: HKUnit.kilocalorieUnit(),
doubleValue: 800.0);
let greaterThanHighCalorie = HKQuery.predicateForQuantitySamplesWithOperatorType(
.GreaterThanOrEqualToPredicateOperatorType, quantity: highCalorie)
let energyConsumed = HKObjectType.quantityTypeForIdentifier(
HKQuantityTypeIdentifierDietaryEnergyConsumed)
let samplePredicates = [energyConsumed: greaterThanHighCalorie]
let foodType = HKCorrelationType.correlationTypeForIdentifier(
HKCorrelationTypeIdentifierFood)
let query = HKCorrelationQuery(type: foodType, predicate: nil, samplePredicates: samplePredicates)
{
query, results, error in
if let correlations = results as? [HKCorrelationQuery] {
for correlation in correlations {
highCalorieFoods.append(correlation)
}
}
else {
// Provide proper error handling here...
println("An error occurred while searching for high calorie food: \(error.localizedDescription)")
abort()
}
println("Found \(highCalorieFoods.count) foods: \(highCalorieFoods)")
}
healthStore.executeQuery(query)
Objective C
NSMutableArray *highCalorieFoods = [NSMutableArray array];
HKQuantity *highCalorie = [HKQuantity quantityWithUnit:[HKUnit kilocalorieUnit]
doubleValue:800.0];
NSPredicate *greaterThanHighCalorie =
[HKQuery predicateForQuantitySamplesWithOperatorType:
NSGreaterThanOrEqualToPredicateOperatorType quantity:highCalorie];
HKQuantityType *energyConsumed =
[HKObjectType quantityTypeForIdentifier:
HKQuantityTypeIdentifierDietaryEnergyConsumed];
NSDictionary *samplePredicates = @{energyConsumed : greaterThanHighCalorie};
HKCorrelationType *foodType =
[HKCorrelationType correlationTypeForIdentifier:HKCorrelationTypeIdentifierFood];
HKCorrelationQuery *query =
[[HKCorrelationQuery alloc]
initWithType:foodType predicate:nil
samplePredicates:samplePredicates
completion:^(HKCorrelationQuery *query, NSArray *correlations, NSError *error) {
if (correlations == nil) {
// Provide proper error handling here...
NSLog(@"An error occurred while searching for high calorie food: %@",
error.localizedDescription);
abort();
}
for (HKCorrelation *correlation in correlations) {
[highCalorieFoods addObject:correlation];
}
NSLog(@"Found %lu foods: %@", (unsigned long)[highCalorieFoods count], highCalorieFoods);
}];
[self.healthStore executeQuery:query];
Перечисление 1 начинается путем установки массива для хранения наших высоких продуктов калории. Затем, пример кода создает предикат, соответствующий количества, больше, чем или равный 800 ккал. Это тогда создает словарь с помощью текстового объекта количества для диетической энергии, расходуемой как ключ и недавно создаваемый предикат как значение. Это использует этот словарь в качестве демонстрационных предикатов для запроса корреляции.
В обработчике завершения запроса пример кода сначала проверяет, чтобы видеть, произошла ли ошибка. Если никакие ошибки не произошли, это добавляет результаты к массиву высоких продуктов калории. Тогда это регистрирует число соответствия выборок, найденных, и содержание высокого продовольственного массива калории.
Как только пример кода заканчивает объявлять обработчик завершения, запрос готов использовать. Пример кода просто выполняет запрос на хранилище HeathKit.
Разделение на подклассы примечаний
Как много классов HealthKit, HKCorrelationQuery
класс не должен быть разделен на подклассы.
-
init (type:predicate:samplePredicates:completion:) - initWithType:predicate:samplePredicates:completion:
Инстанцирует и возвращает запрос корреляции.
Объявление
Swift
init!(type
correlationType
: HKCorrelationType!, predicatepredicate
: NSPredicate!, samplePredicatessamplePredicates
: [NSObject : AnyObject]!, completioncompletion
: ((HKCorrelationQuery!, [AnyObject]!, NSError!) -> Void)!)Objective C
- (instancetype)initWithType:(HKCorrelationType *)
correlationType
predicate:(NSPredicate *)predicate
samplePredicates:(NSDictionary *)samplePredicates
completion:(void (^)(HKCorrelationQuery *query, NSArray *correlations, NSError *error))completion
Параметры
correlationType
Тип корреляции для поиска.
predicate
Предикат, ограничивающий результаты, возвращенные запросом. Этот предикат по сравнению с объектами корреляции. Передача
nil
получить все корреляции указанного типа.samplePredicates
Словарь, ключи которого
HKSampleType
экземпляры, и чьи значенияNSPredicate
экземпляры. Запрос выполняет итерации по всем выборкам в корреляции. Для каждой выборки это ищет соответствующий предикат на основе типа выборки и затем оценивает тот предикат против выборки. Если словарь не содержит соответствующий демонстрационный тип, запрос обрабатывает его как anil
предикат, и принимает выборку.Если этот запрос собирается соответствовать корреляцию, тремя вещами должна быть истина:
Объект корреляции должен соответствовать предоставленный параметр предиката.
Для каждого ключа в демонстрационном словаре предиката корреляция должна содержать выборку, тип которой соответствует ключ. Другими словами, ключи из демонстрационного словаря предиката определяют набор требуемых выборок для корреляции.
Для каждой выборки в корреляции используйте тип выборки для поиска его предиката в демонстрационном словаре предиката. Если словарь содержит соответствующий предикат, выборка должна соответствовать тот предикат. Если словарь не содержит соответствующий предикат, выборка проигнорирована (это может иметь любое значение).
completion
Блок, который вызывают, когда запрос заканчивает выполняться. Этот блок берет следующие параметры:
query
Ссылка на запрос, который названный этим блоком.
correlations
Массив, содержащий корреляции, найденные запросом, или
nil
если происходит ошибка.error
Если ошибка произошла, этот параметр содержит объект, описывающий ошибку; иначе, это
nil
.Возвращаемое значение
Недавно инициализированный объект корреляции.
Обсуждение
После инстанцирования запроса, выполненного это путем вызова
HKHealthStore
классexecuteQuery:
метод. Запросы работают на фоновом потоке. Как только запрос завершен, обработчик результатов выполняется на фоновом потоке. Вы обычно диспетчеризируете эти результаты основному потоку для обновления пользовательского интерфейса.Оператор импорта
Objective C
@import HealthKit;
Swift
import HealthKit
Доступность
Доступный в iOS 8.0 и позже.
-
correlationType
СвойствоТип корреляции для поиска. (только для чтения)
Объявление
Swift
@NSCopying var correlationType: HKCorrelationType! { get }
Objective C
@property(readonly, copy) HKCorrelationType *correlationType
Оператор импорта
Objective C
@import HealthKit;
Swift
import HealthKit
Доступность
Доступный в iOS 8.0 и позже.
-
samplePredicates
СвойствоСловарь, ключи которого
HKSampleType
экземпляры и чьи значенияNSPredicate
экземпляры. (только для чтения)Объявление
Swift
var samplePredicates: [NSObject : AnyObject]! { get }
Objective C
@property(readonly, copy) NSDictionary *samplePredicates
Обсуждение
Запрос использует этот словарь для выполнения сложных тестов против содержания корреляции. Для получения дополнительной информации посмотрите
initWithType:predicate:samplePredicates:completion:
.Оператор импорта
Objective C
@import HealthKit;
Swift
import HealthKit
Доступность
Доступный в iOS 8.0 и позже.