HKSampleQuery
Оператор импорта
Swift
import HealthKit
Objective C
@import HealthKit;
Доступность
Доступный в iOS 8.0 и позже.
HealthKit использует демонстрационные запросы для поиска демонстрационных данных в хранилище HealthKit. Можно использовать демонстрационные запросы для поиска любых конкретных подклассов HKSample класс, включая HKCategorySample, HKCorrelation, HKQuantitySample, и HKWorkout объекты.
Демонстрационная выборка возвратов запроса возражает, что соответствуют предоставленный тип и предикат. Можно обеспечить порядок сортировки для возвращенных выборок или ограничить число возвращенных выборок. Другие классы запроса могут использоваться для выполнения более специализированных поисков и вычислений. Для получения дополнительной информации см. Ссылку класса HKQuery.
Демонстрационные запросы являются неизменными: свойства запроса установлены, когда это сначала создается. Они не могут измениться.
Выполнение запросов
Вы создаете демонстрационный запрос путем вызова initWithSampleType:predicate:limit:sortDescriptors:resultsHandler: инициализатор. После того, как запрос инстанцируют, Вы выполняете его путем вызова медицинского хранилища executeQuery: метод. Этот метод выполняет запрос на анонимной очереди фоновых задач. Когда запрос завершен, он выполняет обработчик результатов на очереди фоновых задач. Как правило, Вы диспетчеризируете эти результаты назад основной очереди для обновления пользовательского интерфейса.
Перечисление 1 показывает, как создать запрос и обработать результаты. Этот код взят от AAPLJournalViewController.m файл в Адаптации: Сохраните и Получите Данные HealthKit.
Swift
let calendar = NSCalendar.currentCalendar()let now = NSDate()let components = calendar.components(.CalendarUnitYear | .CalendarUnitMonth | .CalendarUnitDay, fromDate: now)let startDate = calendar.dateFromComponents(components)let endDate = calendar.dateByAddingUnit(.CalendarUnitDay, value: 1, toDate: startDate, options: NSCalendarOptions(0))let sampleType = HKSampleType.quantityTypeForIdentifier(HKQuantityTypeIdentifierDietaryEnergyConsumed)let predicate = HKQuery.predicateForSamplesWithStartDate(startDate, endDate: endDate, options: .None)let query = HKSampleQuery(sampleType: sampleType, predicate: predicate, limit: 0, sortDescriptors: nil) {query, results, error inif results {println("An error occured fetching the user's tracked food. In your app, try to handle this gracefully. The error was: \(error.localizedDescripiton)");abort();}dispatch_async(dispatch_get_main_queue()) {foodItems.removeAllObjects()for sample in results as [HKQuantitySample] {var foodName = ""if let foodType: AnyObject = sample.metadata[HKMetadataKeyFoodType] {if let name = foodType as? String {foodName = name}}let joules = sample.quantity.doubleValueForUnit(HKUnit.jouleUnit())let foodItem = AAPLFoodItem.foodItemWithName(foodName, joules: joules)foodItems.addObject(foodItem)}tableView.reloadData()}}healthStore.executeQuery(query)
Objective C
NSCalendar *calendar = [NSCalendar currentCalendar];NSDate *now = [NSDate date];NSDateComponents *components = [calendar components:NSCalendarUnitYear|NSCalendarUnitMonth|NSCalendarUnitDay fromDate:now];NSDate *startDate = [calendar dateFromComponents:components];NSDate *endDate = [calendar dateByAddingUnit:NSCalendarUnitDay value:1 toDate:startDate options:0];HKSampleType *sampleType = [HKSampleType quantityTypeForIdentifier:HKQuantityTypeIdentifierDietaryEnergyConsumed];NSPredicate *predicate = [HKQuery predicateForSamplesWithStartDate:startDate endDate:endDate options:HKQueryOptionNone];HKSampleQuery *query = [[HKSampleQuery alloc] initWithSampleType:sampleType predicate:predicate limit:0 sortDescriptors:nil resultsHandler:^(HKSampleQuery *query, NSArray *results, NSError *error) {if (!results) {NSLog(@"An error occured fetching the user's tracked food. In your app, try to handle this gracefully. The error was: %@.", error);abort();}dispatch_async(dispatch_get_main_queue(), ^{[self.foodItems removeAllObjects];for (HKQuantitySample *sample in results) {NSString *foodName = sample.metadata[HKMetadataKeyFoodType];double joules = [sample.quantity doubleValueForUnit:[HKUnit jouleUnit]];AAPLFoodItem *foodItem = [AAPLFoodItem foodItemWithName:foodName joules:joules];[self.foodItems addObject:foodItem];}[self.tableView reloadData];});}];[self.healthStore executeQuery:query];
Здесь, Update Journal выборка запускается путем вычисления запуска и даты окончания желаемого временного интервала, для создания 24-часового периода, запуска в предыдущую полночь. Затем, это определяет демонстрационный тип для диетической энергии, расходуемой, и предикат, отфильтровывающий любые выборки, не находящиеся в пределах желаемого временного интервала.
С демонстрационным типом и создаваемым предикатом, это создает запрос. Этот запрос возвращается, любые выборки, измеряющие диетическую энергию, использовали, которые находятся в пределах периода времени. Нет никакой границы, установленной для числа выборок, которые оно возвращает, и результаты не сортируются.
Обработчик результатов запускается путем проверки, чтобы видеть, произошла ли ошибка. Если существует ошибка, она распечатывает сообщение журнала к консоли и аварийным прекращениям работы. Иначе, это диспетчеризирует назад основному потоку для обновления UI.
Блок отгрузки начинается путем очистки массива контроллера представления продуктов. Это тогда выполняет итерации по каждому результату, захватывая имя еды (от метаданных) и сумма энергии (в джоулях). Это использует эти значения для создания нового продукта, который это добавляет к массиву продукта.
После того, как все результаты были обработаны, обработчик результата просит, чтобы табличное представление загрузило новые данные.
После того, как блок обработчика результата определяется, запрос завершен. Этот запрос тогда выполняется с помощью хранилища HealthKit.
Разделение на подклассы примечаний
Как много классов HealthKit, HKSampleQuery класс не должен быть разделен на подклассы.
-
init (sampleType:predicate:limit:sortDescriptors:resultsHandler:) - initWithSampleType:predicate:limit:sortDescriptors:resultsHandler:Инстанцирует и возвращает демонстрационный запрос.
Объявление
Swift
init!(sampleTypesampleType: HKSampleType!, predicatepredicate: NSPredicate!, limitlimit: Int, sortDescriptorssortDescriptors: [AnyObject]!, resultsHandlerresultsHandler: ((HKSampleQuery!, [AnyObject]!, NSError!) -> Void)!)Objective C
- (instancetype)initWithSampleType:(HKSampleType *)sampleTypepredicate:(NSPredicate *)predicatelimit:(NSUInteger)limitsortDescriptors:(NSArray *)sortDescriptorsresultsHandler:(void (^)(HKSampleQuery *query, NSArray *results, NSError *error))resultsHandlerПараметры
sampleTypeТип выборки для поиска. Этот объект может быть экземпляром
HKCategoryType,HKCorrelationType,HKQuantityType, илиHKWorkoutTypeклассы.predicateПредикат, ограничивающий результаты, возвращенные запросом. Передача
nilполучить все выборки указанного типа.limitМаксимальное количество выборок, возвращенных запросом. Если Вы хотите возвратить все выборки соответствия, использовать
HKObjectQueryNoLimit.sortDescriptorsresultsHandlerБлок, который вызывают, когда запрос заканчивает выполняться.
Этот блок берет следующие параметры:
queryСсылка на запрос, который названный этим блоком.
resultsМассив, содержащий выборки, найденные запросом, или
nilесли происходит ошибка.errorЕсли ошибка происходит, этот параметр содержит объект, описывающий ошибку. Иначе его значение
nil.Возвращаемое значение
Недавно инициализированный демонстрационный объект запроса.
Обсуждение
После инстанцирования запроса вызовите
HKHealthStoreклассexecuteQuery:метод для выполнения этого запроса. Запросы работают на анонимной очереди фоновых задач. Как только запрос завершен, обработчик результатов выполняется на очереди фоновых задач. Вы обычно диспетчеризируете эти результаты основной очереди обновить пользовательский интерфейс.Оператор импорта
Objective C
@import HealthKit;Swift
import HealthKitДоступность
Доступный в iOS 8.0 и позже.
-
limitСвойствоМаксимальное количество выборок, которые возвращает этот запрос. (только для чтения)
Обсуждение
Наборы значений этого свойства максимальное количество выборок, которые запрос возвращает после завершения.
Если Вы в частности интересуетесь получением только новых выборок (выборки, добавленные начиная с последнего запроса), рассматриваете использование
HKAnchoredObjectQueryзапрос вместо этого.Оператор импорта
Objective C
@import HealthKit;Swift
import HealthKitДоступность
Доступный в iOS 8.0 и позже.
-
sortDescriptorsСвойствоДескрипторы вида, указывающие порядок результатов, возвращенных этим запросом. (только для чтения)
Объявление
Swift
var sortDescriptors: [AnyObject]! { get }Objective C
@property(readonly, copy) NSArray *sortDescriptorsОператор импорта
Objective C
@import HealthKit;Swift
import HealthKitДоступность
Доступный в iOS 8.0 и позже.
-
Константа раньше ограничивала число результатов, возвращенных демонстрационным запросом.
Объявление
Swift
var HKObjectQueryNoLimit: Int32 { get }Objective C
#define HKObjectQueryNoLimit (0)Константы
