2015-10-23 4 views
1

У меня есть 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, что не имеет для меня никакого смысла.

+0

Методы не вызывают из строя. Проблема в том, что функция выполняется асинхронно. Вам нужно вызывать зависимый код от обработчика завершения –

+0

Итак, функция 'updateBMI' вызывается, а' updateHeight' все еще работает? – 123

+0

'updateHeight' возвращается до вызова обработчика завершения, поэтому ответ« почти определенно ». –

ответ

4

Методы не вызываются из строя. Проблема в том, что функция выполняется асинхронно. Вам нужно вызвать зависимый код от обработчика завершения.

Смежные вопросы