从HealthKit获取一系列血糖logging

我正在使用swift关于HealthKit的一些教程,我正在遵循的教程之一是如何从HealthKit中检索一些数据,如体重,身高的年龄。 本教程将演示如何检索每个logging的最新logging,以下代码显示:

func readMostRecentSample(sampleType:HKSampleType , completion: ((HKSample!, NSError!) -> Void)!) { // 1. Build the Predicate let past = NSDate.distantPast() as! NSDate let now = NSDate() let mostRecentPredicate = HKQuery.predicateForSamplesWithStartDate(past, endDate:now, options: .None) // 2. Build the sort descriptor to return the samples in descending order let sortDescriptor = NSSortDescriptor(key:HKSampleSortIdentifierStartDate, ascending: false) // 3. we want to limit the number of samples returned by the query to just 1 (the most recent) let limit = 1 // 4. Build samples query let sampleQuery = HKSampleQuery(sampleType: sampleType, predicate: mostRecentPredicate, limit: limit, sortDescriptors: [sortDescriptor]) { (sampleQuery, results, error ) -> Void in if let queryError = error { completion(nil,error) return; } // Get the first sample let mostRecentSample = results.first as? HKQuantitySample // Execute the completion closure if completion != nil { completion(mostRecentSample,nil) } } // 5. Execute the Query self.healthKitStore.executeQuery(sampleQuery) } 

然后在其他类中,开发人员传递参数以获取所需的最新logging,以下代码显示检索高度logging的方法:

 func updateHeight() { // 1. Construct an HKSampleType for Height let sampleType = HKSampleType.quantityTypeForIdentifier(HKQuantityTypeIdentifierHeight) // 2. Call the method to read the most recent Height sample self.healthManager?.readMostRecentSample(sampleType, completion: { (mostRecentHeight, error) -> Void in if( error != nil ) { println("Error reading height from HealthKit Store: \(error.localizedDescription)") return; } 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); } // 4. Update UI. HealthKit use an internal queue. We make sure that we interact with the UI in the main thread dispatch_async(dispatch_get_main_queue(), { () -> Void in self.heightLabel.text = heightLocalizedString self.updateBMI() }); }) } 

我为第一个创build了一个类似的方法,但是几乎没有变化,所以我可以得到10个葡萄糖logging的数组:

 func readAllGlucose(sampleType:HKSampleType , completion: (([HKSample!], NSError!) -> Void)!) { let now = NSDate() let df = NSDateFormatter() df.dateFormat = "yyyy-MM-dd" let pastt = df.dateFromString("2015-05-18") //let mostRecentPredicate = HKQuery.predicateForSamplesWithStartDate(past, endDate:now, options: .None) let allreadings = HKQuery.predicateForSamplesWithStartDate(pastt, endDate: now, options: .None) // 2. Build the sort descriptor to return the samples in descending order let sortDescriptor = NSSortDescriptor(key:HKSampleSortIdentifierStartDate, ascending: false) // 3. we want to limit the number of samples returned by the query to just 1 (the most recent) let limit = 10 // 4. Build samples query let sampleQuery = HKSampleQuery(sampleType: sampleType, predicate: allreadings, limit: limit, sortDescriptors: [sortDescriptor]) { (sampleQuery, results, error ) -> Void in if let queryError = error { completion([nil],error) return; } // Get the first sample let allSamples = results as? [HKQuantitySample] // Execute the completion closure if completion != nil { completion(allSamples!,nil) } } // 5. Execute the Query self.healthKitStore.executeQuery(sampleQuery) } 

然后我创build了另一个类似于updateHeight()方法的方法,但是当然要做一些必要的修改:

 func updateLastGlucoRecords() { // 1. Construct an HKSampleType for weight let sampleType = HKSampleType.quantityTypeForIdentifier(HKQuantityTypeIdentifierBloodGlucose) // 2. Call the method to read the most recent weight sample self.healthManager?.readAllGlucose(sampleType, completion: {([allReadings], error) -> Void in if (error != nil) { println("Error reading glucose readings from HealthKit Store: \(error.localizedDescription)") return; } var glucoseLocalizedString = self.kUnknownString; self.glucose = allReadings as? [HKQuantitySample] for reading in readings { if let record = reading.quantity { glucoseLocalizedString = record } dispatch_async(dispatch_get_main_queue(), { () -> Void in self.glucoReadings.append("\(glucoseLocalizedString)") }) } }) self.healthManager?.readMostRecentSample(sampleType, completion: { (mostRecentWeight, error) -> Void in if( error != nil ) { println("Error reading weight from HealthKit Store: \(error.localizedDescription)") return; } var weightLocalizedString = self.kUnknownString; // 3. Format the weight to display it on the screen self.weight = mostRecentWeight as? HKQuantitySample; if let kilograms = self.weight?.quantity.doubleValueForUnit(HKUnit.gramUnitWithMetricPrefix(.Kilo)) { let weightFormatter = NSMassFormatter() weightFormatter.forPersonMassUse = true; weightLocalizedString = weightFormatter.stringFromKilograms(kilograms) } // 4. Update UI in the main thread dispatch_async(dispatch_get_main_queue(), { () -> Void in self.weightLabel.text = weightLocalizedString self.updateBMI() }); }); } 

但不幸的是,我得到了两个错误:

 self.healthManager?.readAllGlucose(sampleType, completion: {([allReadings], error) -> Void in 

第一个错误:

[HKSample!]'不是'<>的子types

第二个错误:

使用未声明的types“allReadings”

如果有人有任何想法可以解决这个问题,我将感谢和感激

提前致谢

我认为这个问题是你在([allReadings], error)周围使用方括号。 尝试删除它们。 你不需要指出allReadings是一个数组。 这将由编译器推断,因为闭包的第一个参数是一个数组。