Swift - 从Apple HealthKit获取葡萄糖数据

时间:2015-05-13 11:16:36

标签: ios swift health-kit

我正在做一些关于如何向Apple HealthKit应用程序发送和接收数据的教程。

我正在做的部分教程是如何从healthKitStore获得高度。

我想做同样的事情,但要检索葡萄糖数据而不是高度,我做了所有的步骤,但却陷入了这段代码:

var heightLocalizedString = self.kUnknownString;
        self.height = mostRecentHeight as? HKQuantitySample;
        // 3. Format the height to display it on the screen
        if let meters = self.height?.quantity.doubleValueForUnit(HKUnit.meterUnit()) {
            let heightFormatter = NSLengthFormatter()
            heightFormatter.forPersonHeightUse = true;
            heightLocalizedString = heightFormatter.stringFromMeters(meters);
        }

如图所示,meter var被分配一个来自meterUnit的double值,然后创建一个常量格式化器来格式化meter var并将其分配给预先声明的var(heightLocalizedString)

我的问题是,当我使用这种方法进行葡萄糖阅读时,我面临一些问题,第一个问题是我无法弄清楚可用的葡萄糖单位是什么,我得到的唯一一个是

HKUnitMolarMassBloodGlucose

当我使用它时会出现错误"' NSNumber'不是HKUnit'" 的子类型,从错误中可以清楚地看出此参数不是HKUnit类的子类型。

另一个问题是,如前面的代码所示,有一个高度为(NSLengthFormatter())的格式化程序,但是我无法看到这样的Glucose格式化程序。

实际上,我不确定是否必须完全按照教程获取葡萄糖数据,但我也没有看到另一种方法。

有什么想法吗?

以下是我用来检索葡萄糖数据的代码:

func updateGluco(){

    let sampleType = HKSampleType.quantityTypeForIdentifier(HKQuantityTypeIdentifierBloodGlucose)
    self.healthManager?.readMostRecentSample(sampleType, completion: {(mostRecentGluco, error) -> Void in

        if (error != nil){
            println("Error reading blood glucose from HealthKit store: \(error.localizedDescription)")
            return;
        }

        var glucoLocalizedString = self.kUnknownString;
        self.gluco = mostRecentGluco as? HKQuantitySample
        println("\(self.gluco?.quantity.doubleValueForUnit(HKUnit.moleUnitWithMolarMass(HKUnitMolarMassBloodGlucose)))")
        self.gluco?.quantity.doubleValueForUnit(HKUnit.moleUnitWithMolarMass(HKUnitMolarMassBloodGlucose))
        if let mmol = self.gluco?.quantity.doubleValueForUnit(HKUnit.moleUnitWithMolarMass(HKUnitMolarMassBloodGlucose)) {
            glucoLocalizedString = "\(mmol)"
        } else {
            println("error reading gluco data!")
        }
        dispatch_async(dispatch_get_main_queue(), {() -> Void in
        self.glucoLabel.text = glucoLocalizedString})
    })
}

" mmol"变量返回零值。

我不知道这是否与我的问题有关,但我刚读过一篇文章说Apple在iOS 8.2中带回了血糖跟踪,我的应用程序部署目标是8.1。 (尽管XCode已更新到上一版本,但我无法将部署目标升级到最新的iOS!)

3 个答案:

答案 0 :(得分:4)

查看标题,血糖需要类型单位(质量/体积),这意味着您需要指定一个质量单位除以体积单位的复合单位:

HK_EXTERN NSString * const HKQuantityTypeIdentifierBloodGlucose NS_AVAILABLE_IOS(8_0);              // Mass/Volume,                 Discrete

通常,人们测量血糖的单位是mg / dL和mmol / L.您可以使用以下方法构建这些:

HKUnit *mgPerdL = [HKUnit unitFromString:@"mg/dL"];

HKUnit *mmolPerL = [[HKUnit moleUnitWithMetricPrefix:HKMetricPrefixMilli molarMass:HKUnitMolarMassBloodGlucose] unitDividedByUnit:[HKUnit literUnit]];

请注意,doubleValueForUnit:需要HKUnit,而不是NSNumber。有关更多信息,请参阅

答案 1 :(得分:0)

我找到了解决方案

要获取样本gulco的实际值,我只需使用此属性:self.gluco?.quantity,这正是我之前想要的。

HealthKit中葡萄糖的默认单位为mg\dL,为了更改单位,我只需从结果中提取数字值,然后将其除以18。

答案 2 :(得分:0)

以下是我用于检索葡萄糖数据的代码:

 NSInteger limit = 0;
    NSPredicate* predicate = [HKQuery predicateForSamplesWithStartDate:[NSDate date] endDate:[NSDate date] options:HKQueryOptionStrictStartDate];;
    NSString *endKey =  HKSampleSortIdentifierEndDate;
    NSSortDescriptor *endDate = [NSSortDescriptor sortDescriptorWithKey: endKey ascending: NO];
    HKSampleQuery *query = [[HKSampleQuery alloc] initWithSampleType: [HKQuantityType quantityTypeForIdentifier:HKQuantityTypeIdentifierBloodGlucose]
                                                           predicate: predicate
                                                               limit: limit
                                                     sortDescriptors: @[endDate]
                                                      resultsHandler:^(HKSampleQuery *query, NSArray* results, NSError *error)
                            {
                                dispatch_async(dispatch_get_main_queue(), ^{
                                    // sends the data using HTTP
                                    // Determine the Blood Glucose.
                                    NSLog(@"BloodGlucose=%@",results);

                                    if([results count]>0){
                                        NSMutableArray *arrBGL=[NSMutableArray new];
                                        for (HKQuantitySample *quantitySample in results) {
                                            HKQuantity *quantity = [quantitySample quantity];
                                            double bloodGlucosegmgPerdL = [quantity doubleValueForUnit:[HKUnit bloodGlucosegmgPerdLUnit]];
                                            NSLog(@"%@",[NSString stringWithFormat:@"%.f g",bloodGlucosegmgPerdL]);

                                        }
                                    }

                                });

                            }];

    [self.healthStore executeQuery:query];

// And Units :

@implementation HKUnit (HKManager)
+ (HKUnit *)heartBeatsPerMinuteUnit {
    return [[HKUnit countUnit] unitDividedByUnit:[HKUnit minuteUnit]];
}
+ (HKUnit *)bloodGlucosegmgPerdLUnit{
    return [[HKUnit gramUnit] unitDividedByUnit:[HKUnit literUnit]];
}