我正在做一些关于如何向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!)
答案 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]];
}