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 in
if 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!(sampleType
sampleType
: HKSampleType!, predicatepredicate
: NSPredicate!, limitlimit
: Int, sortDescriptorssortDescriptors
: [AnyObject]!, resultsHandlerresultsHandler
: ((HKSampleQuery!, [AnyObject]!, NSError!) -> Void)!)Objective C
- (instancetype)initWithSampleType:(HKSampleType *)
sampleType
predicate:(NSPredicate *)predicate
limit:(NSUInteger)limit
sortDescriptors:(NSArray *)sortDescriptors
resultsHandler:(void (^)(HKSampleQuery *query, NSArray *results, NSError *error))resultsHandler
Параметры
sampleType
Тип выборки для поиска. Этот объект может быть экземпляром
HKCategoryType
,HKCorrelationType
,HKQuantityType
, илиHKWorkoutType
классы.predicate
Предикат, ограничивающий результаты, возвращенные запросом. Передача
nil
получить все выборки указанного типа.limit
Максимальное количество выборок, возвращенных запросом. Если Вы хотите возвратить все выборки соответствия, использовать
HKObjectQueryNoLimit
.sortDescriptors
resultsHandler
Блок, который вызывают, когда запрос заканчивает выполняться.
Этот блок берет следующие параметры:
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)
Константы