如何解决Swift - 如何从 HealthKit 类返回值
我是一个完整的初学者,只是在玩 HealthKit。也许你可以为我回答以下问题:
我有以下两个类:
//UIViewController
class ViewController: UIViewController {
@IBOutlet weak var BloodPressure: UILabel!
override func viewDidLoad() {
super.viewDidLoad()
HealthControlAccess()
let healthValue = HealthValue()
healthValue.bloodPressureDiastolic()
print (healthValue.averageDiastolic)
}
}
//健康值
class HealthValue {
var averageDiastolic = 0
func bloodPressureDiastolic() {
print ("bloodPressureDiastolic")
let store = HKHealthStore()
guard let bloodPressureDiastolic = HKObjectType.quantityType(forIdentifier: .bloodPressureDiastolic) else {
// This should never fail when using a defined constant.
fatalError("*** Unable to get the step count type ***")
}
let query = HKSampleQuery(sampleType: bloodPressureDiastolic,predicate: nil,limit: Int(HKObjectQueryNoLimit),sortDescriptors: nil) {
query,results,error in
guard let samples = results as? [HKQuantitySample] else {
// Handle any errors here.
return
}
var pressureDiastolic : String
var pressureDiastolicArray : [Int] = Array()
for sample in samples {
pressureDiastolic = "\(sample.quantity)"
pressureDiastolicArray.append(Int(pressureDiastolic.split(separator: " ")[0])!)
}
if pressureDiastolicArray.count > 0 {
self.averageDiastolic = pressureDiastolicArray.sum()/pressureDiastolicArray.count
}
}
store.execute(query)
}
我通过 ViewController 初始化 HealthValue 类,但我没有变量 healthValue.averageDiastolic 输出的值。
我做错了什么?
解决方法
HKSampleQuery 是异步的。您需要等待它完成才能访问结果。通常这是通过完成处理程序完成的:
func bloodPressureDiastolic(completion: (Double) -> Void) {
... Current code ...
let query = HKSampleQuery(sampleType: bloodPressureDiastolic,predicate: nil,limit: Int(HKObjectQueryNoLimit),sortDescriptors: nil) {
... Current code ...
if pressureDiastolicArray.count > 0 {
self.averageDiastolic = pressureDiastolicArray.sum()/pressureDiastolicArray.count
}
Dispatch.main.async { [averageDiastolic] in
completion(averageDiastolic) // <===
}
}
store.execute(query)
}
然后你会这样称呼它:
class ViewController: UIViewController {
@IBOutlet weak var BloodPressure: UILabel!
let healthValue = HealthValue()
override func viewDidLoad() {
super.viewDidLoad()
HealthControlAccess() // Not sure what this is doing. May need to wait for it to complete
healthValue.bloodPressureDiastolic {
print($0)
}
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。