如何从HealthKit查询中获取变量可访问外部函数?

时间:2014-12-05 17:05:59

标签: ios core-data swift

我已获得访问HealthStore的权限,并且我已成功将数据打印到控制台。但是我需要访问函数外部的数据,我已经创建了一个单例,它工作正常。唯一的问题是,来自示例查询(performQueryForHrSamples())的数据不会在函数外部持久存在,这意味着当我在函数外部调用变量beatsPerMin时,我得到nil。该变量以var beatsPerMin:Double!

启动

我试图“取消”该功能以找到创建 - >的方法。返回,但没有成功。

有人可以帮我找到一种方法让这个变量在perfromQueryForHRSamples()之外可以访问吗?也许我可以将数据保存到CoreData,如下所示:(Can I save value in a completion Handler)?

import UIKit

class ViewController: UIViewController {


    var beatsPerMin:Double!


    override func viewDidLoad() {
        super.viewDidLoad()

        somefunc1()
        perfromQueryForHRSamples()
        somefunc3()
    }

    func somefunc1() {

        ....... {
                (success, error) in
                if success {
                    println("success")
                } else {
                    println("cancelled \(error)")
                }
        }
    }


    **func perfromQueryForHRSamples**() {
        let heartRateSample = HKSampleType.quantityTypeForIdentifier(HKQuantityTypeIdentifierHeartRate)
        let sampleQuery = HKSampleQuery(
            sampleType: heartRateSample,
            predicate: nil,
            limit: 0,
            sortDescriptors: nil) {
                (sampleQuery, samples, error) in

                for sample in samples as [HKQuantitySample]
                {
                    **self.beatsPerMin**  = sample.quantity.doubleValueForUnit(self.heartRateUnit)
                    println("Query output: \(self.beatsPerMin)")
                }
        }

        self.healthStore.executeQuery(sampleQuery)



    } 

    func somefunc3() {
        println("\(beatsPerMin)")

    }

}

1 个答案:

答案 0 :(得分:1)

  

...我发现我的功能有时候不会被评估,除非他们被称为" ...

仅供参考,在从另一个函数调用函数之前,不会评估任何函数。

如果somefunc2生成Double作为输出,那么它应输出Double

func somefunc2() -> Double {
    var result: Double = 0.0
    // figure out what the result should be and assign it to result
    return result
}

如果somefunc3需要Double作为输入,则它应接受Double作为参数。

func somefunc3(z: Double) {
    // do stuff with z
    println("\(z)")
}

然后您可以通过以下值连接这两个函数:

let z = somefunc2()
somefunc3(z)

或者如果你想成为"聪明的"。

somefunc3(somefunc2())

在您的编程教育的这一点上,我建议您更多地在操场上乱搞,直到您感觉到功能如何相互作用。

祝你好运!