2017-08-30 91 views
1

我一直在尝试一段时间获取心率,以便在图表中绘制。正如文档中提到的,心率可以通过HKStatisticsCollectionQuery获取。我正在尝试从当前日期获取一周的数据。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返回为nil.Am我做错了什么在这里?

回答

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; 
} 
+0

感谢您的回应。我会尝试一下代码并让你知道。 –

+0

self.lastAnchor未定义 – coolcool1994

+0

您可以使用开始日期作为锚点,它应该可以工作。 –