У меня есть updateHeight
, updateWeight
и updateBMI
методов в моем классе HealthAlgorithm
. Затем я пытаюсь вызвать их, чтобы в ViewController.swift
Методы обжига не в порядке
HealthAlgorithm.swift
:
//MARK: Properties
var healthManager:HealthManager?
var kUnknownString = "Unknown"
var bmi:Double?
var height:HKQuantitySample?
var weight:HKQuantitySample?
func updateHeight() {
// 1. Construct an HKSampleType for weight
let sampleType = HKSampleType.quantityTypeForIdentifier(HKQuantityTypeIdentifierHeight)
// 2. Call the method to read the most recent weight sample
HealthManager().readMostRecentSample(sampleType!, completion: { (mostRecentHeight, error) -> Void in
if(error != nil)
{
print("Error reading height from HealthKit Store: \(error.localizedDescription)")
return
}
var heightLocalizedString = self.kUnknownString
self.height = mostRecentHeight as? HKQuantitySample
print(self.height)
// 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)
}
})
}
func updateBMI(){
if weight != nil && height != nil {
// 1. Get the weight and height values from the samples read from HealthKit
let weightInKilograms = weight!.quantity.doubleValueForUnit(HKUnit.gramUnitWithMetricPrefix(.Kilo))
let heightInMeters = height!.quantity.doubleValueForUnit(HKUnit.meterUnit())
bmi = (weightInKilograms/(heightInMeters * heightInMeters))
}
print("BMI: ",bmi)
}
Я называю эти методы в ViewController.swift
так:
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
HealthAlgorithm().updateHeight()
HealthAlgorithm().updateWeight()
HealthAlgorithm().updateBMI()
}
Проблема заключается в том, что индекс массы тела возвращается как nil
. Причина, по которой это происходит, заключается в том, что метод updateBMI
срабатывает до updateHeight
и updateWeight
.
Я использую print(self.height)
сразу после я определить переменную в методе updateHeight
, и я использую print("BMI: ", bmi)
сразу после я определить BMI переменную в методе updateBMI
. Поскольку я звоню updateHeight
сначала, print(self.height)
должен произойти до print("BMI: ", bmi)
, но по какой-то причине возвращается BMI: nil
, что не имеет для меня никакого смысла.
Методы не вызывают из строя. Проблема в том, что функция выполняется асинхронно. Вам нужно вызывать зависимый код от обработчика завершения –
Итак, функция 'updateBMI' вызывается, а' updateHeight' все еще работает? – 123
'updateHeight' возвращается до вызова обработчика завершения, поэтому ответ« почти определенно ». –