Понимание результатов HKSourceQuery или источников в целом

Я только что сделал HKSourceQuery и получил некоторые результаты. Когда я делаю println результатов, я получаю это: <HKSource:0x156c1520 "Health" (com.apple.Health)>//description of the object

Как мне использовать это, чтобы сделать предикат с использованием HKQuery.predicateForObjectsFromSource(/* source goes here */)


person Kelvin Lau    schedule 28.03.2015    source источник


Ответы (1)


Вот пример кода в Obj-c,

NSSortDescriptor *timeSortDesriptor = [[NSSortDescriptor alloc] initWithKey:HKSampleSortIdentifierEndDate ascending:NO];

        HKQuantityType *quantityType = [HKQuantityType quantityTypeForIdentifier:HKQuantityTypeIdentifierActiveEnergyBurned];
        HKSourceQuery *sourceQuery = [[HKSourceQuery alloc] initWithSampleType:quantityType samplePredicate:nil completionHandler:^(HKSourceQuery *query, NSSet *sources, NSError *error) {

            //Here, sources is a set of all the HKSource objects available for "quantityTypeForIdentifier:HKQuantityTypeIdentifierActiveEnergyBurned"

            HKSource *targetedSource = [[sources allObjects] firstObject];//Assume this as your targeted source
            if(targetedSource)
            {
                NSPredicate *sourcePredicate = [HKQuery predicateForObjectsFromSource:targetedSource];
                HKSampleQuery *query = [[HKSampleQuery alloc] initWithSampleType:quantityType predicate:sourcePredicate limit:HKObjectQueryNoLimit sortDescriptors:[NSArray arrayWithObject:timeSortDesriptor] resultsHandler:^(HKSampleQuery *query, NSArray *results, NSError *error) {
                   //results array contains the HKSampleSample objects, whose source is "targetedSource".
                }];
                [self.healthStore executeQuery:query];
            }
        }];
        [self.healthStore executeQuery:sourceQuery];

ОБНОВЛЕНИЕ 1:

  1. Невозможно построить объект HKSource вручную, используя [HKSource alloc] init]. В рамках HealthKit Apple ограничила создание объектов с помощью init для большинства классов HK.
  2. Я считаю, что вы можете найти свой объект HKSource из набора sources, используя свойства HKSource, такие как name и bundleIdentifier.

Вот пример кода,

    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SELF.source.bundleIdentifier = 'com.XXXX.XXXXX'"];
    NSArray  *tempResults = [[sources allObjects] filteredArrayUsingPredicate:predicate];

    HKSource *targetedSource = [tempResults firstObject];
person Bhanu Prakash    schedule 30.03.2015
comment
Еще раз спасибо за ответ, Бхану. К сожалению, я не могу предположить, что целевым источником является тот, который мне нужен. Например, я просто запустил аналогичный алгоритм, и исходник, который я хотел, находится в 4-м индексе исходного массива. На самом деле, не может быть никаких гарантий, что он находится в определенном порядке. Знаете ли вы, как вы можете создать явный HKSource, например, [[HKSource alloc] initWithSource: HKSourceiPhone]‹ - это не работает. - person Kelvin Lau; 30.03.2015