HKStatisticsCollectionQuery用于获取心率健康工具包

时间:2017-08-30 10:13:34

标签: ios objective-c health-kit

我一直试图获取心率以便在图表中绘图。正如文档中所提到的,心率可以通过HKStatisticsCollectionQuery获取。我想从当前日期获取一周的数据。

但我无法获取所提取的数据。以下是我使用HKStatisticsCollectionQuery进行心率访问的代码:

NSCalendar *calendar = [NSCalendar currentCalendar];
NSDateComponents *interval = [[NSDateComponents alloc] init];
NSDate *anchorDate = [[NSDate alloc] init];
NSDateComponents *anchorComponents =
    [calendar components:NSCalendarUnitDay | NSCalendarUnitMonth |
     NSCalendarUnitYear | NSCalendarUnitWeekday fromDate:[NSDate date]];

NSDate *currentDisplayEndDate = [NSDate date];
NSDate *newDate = [calendar startOfDayForDate: currentDisplayEndDate];  NSDate *startDate = [newDate dateByAddingTimeInterval:-6*24*60*60];
anchorDate = startDate;
 NSPredicate *predicate = [HKQuery predicateForSamplesWithStartDate:self.startDate endDate:_currentDisplayEndDate options:HKQueryOptionStrictStartDate];

HKQuantityType *quantityType =
    [HKObjectType quantityTypeForIdentifier:quantityId];

    // Create the query

    HKStatisticsCollectionQuery *query =
    [[HKStatisticsCollectionQuery alloc]
     initWithQuantityType:quantityType
     quantitySamplePredicate:predicate
     options:HKStatisticsOptionDiscreteMax
     anchorDate:anchorDate
     intervalComponents: interval];

    // Set the results handler
    query.initialResultsHandler =
    ^(HKStatisticsCollectionQuery *query, HKStatisticsCollection *results, NSError *error) {

        if (error) {
            // Perform proper error handling here
            NSLog(@"*** An error occurred while calculating the statistics: %@ ***",
                  error.localizedDescription);
        }
        [results
 enumerateStatisticsFromDate:startDate
 toDate:endDate
 withBlock:^(HKStatistics *result, BOOL *stop) {

     HKQuantity *quantity = result.sumQuantity;
     if (quantity) {
         NSDate *date = result.startDate;
         double value = [quantity doubleValueForUnit:[[HKUnit unitFromString:@"count/min"]];

         // Call a custom method to plot each data point.
     }

 }];
    };

    [healthStore executeQuery:query];

我的HKStatistics *results返回为零。我在这里做错了什么?

1 个答案:

答案 0 :(得分:3)

问题不在你想到的地方,结果是通过统计查询返回的,但是在心率的情况下,它不会给出心跳量,因此HKQuantity *quantity = result.sumQuantity;返回nil。如果您要正确检查,您会看到results.statistics会为您提供有关记录心率的一些数据,但没有心率数量,而只是记录数据的开始和结束日期。我建议,继续你HKAnchoredQuery同样的,我将提供代码,在这里:

-(double)get_heartRates
{
//code to heart beats average, modify as needed
NSDate *startDate1 = [NSDate distantPast];
NSPredicate *Predicate = [HKQuery predicateForSamplesWithStartDate:startDate1 endDate:[NSDate date] options:HKQueryOptionStrictEndDate];
HKSampleType *object = [HKSampleType quantityTypeForIdentifier:HKQuantityTypeIdentifierHeartRate];

sum_Of_HeartRates=0.0;

HKAnchoredObjectQuery  *heartQuery = [[HKAnchoredObjectQuery alloc] initWithType:object predicate:Predicate anchor:self.lastAnchor limit:0 resultsHandler:^(HKAnchoredObjectQuery *query, NSArray<HKSample *> *sampleObjects, NSArray<HKDeletedObject *> *deletedObjects, HKQueryAnchor *newAnchor, NSError *error) {

    NSLog(@"Sample counts:%ld",sampleObjects.count);
    for(int i=0;i<(int)sampleObjects.count;i++)
    {
        HKQuantitySample *sample = (HKQuantitySample *)[sampleObjects objectAtIndex:i];
        HKQuantity *quantity = sample.quantity;
        double bpm_Values= [quantity doubleValueForUnit:[HKUnit unitFromString:@"count/min"]];
        sum_Of_HeartRates=sum_Of_HeartRates+bpm_Values;

    }
    avg_heartBeats=sum_Of_HeartRates/(int)sampleObjects.count;
}];
[heartQuery setUpdateHandler:^(HKAnchoredObjectQuery *query, NSArray<HKSample *> *SampleArray, NSArray<HKDeletedObject *> *deletedObjects, HKQueryAnchor *Anchor, NSError *error) {

    HKQuantitySample *sample = (HKQuantitySample *)[SampleArray objectAtIndex:0];
    HKQuantity *quantity = sample.quantity;
    new_Updated_Data =[quantity doubleValueForUnit:[HKUnit unitFromString:@"count/min"]];
    NSLog(@"new quantity:%f",new_Updated_Data);
}];
[self.healthStore executeQuery:heartQuery];
NSLog(@"updated data %f",new_Updated_Data);
return avg_heartBeats;
}