Har*_*ish 2 function ios completionhandler swift healthkit
好吧,标题真的说明了一切,我无法在任何适合我的地方找到答案,所以我转向StackOverFlow.我正在尝试获取用户步数并将该值分配给UILabel.所以这里是我的一些代码(请注意,此函数包含在另一个类中,因此标签不在此函数的范围内):
func readTodayHealthData() -> Int {
var stepCount: Int = 0
func getStepsHealthData() {
let stepsUnit = HKUnit.countUnit()
let sumOption = HKStatisticsOptions.CumulativeSum
let stepsHealthDataQuery = HKStatisticsQuery(quantityType: stepsHealth, quantitySamplePredicate: predicate, options: sumOption) {
query, results, error in
if let sumQuantity = results?.sumQuantity() {
dispatch_async(dispatch_get_main_queue(), {
stepCount = sumQuantity.doubleValueForUnit(stepsUnit) * 2
})
}
}
healthKitStore?.executeQuery(stepsHealthDataQuery)
}
return stepCount
}
//Set UILabel Value
//**This code is in my View Controller which is in a separate class as a result this label is NOT within the scope of this function.**
myLabel.text = String(readTodayHealthData)
Run Code Online (Sandbox Code Playgroud)
然后,当我在实际设备上运行应用程序时,我看到标签文本为零,我知道我今天已经做了一些行走:).所以,我认为问题在于,当我尝试设置标签值时,函数尚未完全执行.
我知道这一点,因为当我使用延迟功能并等待两秒钟时,我最终得到一个值,但如果我不等待,那么我得到零值.
所以,主要的问题是:如何检查,当功能被完全执行完毕?
问题是你正在使用的操作是异步的,那么你需要正确处理,你有两个选择:
更新UILabel在completionHandler自己的函数中getStepsHealthData在主线程,因为你要更新UI,就像这样:
func getStepsHealthData() {
var stepCount: Int = 0
let stepsUnit = HKUnit.countUnit()
let sumOption = HKStatisticsOptions.CumulativeSum
let stepsHealthDataQuery = HKStatisticsQuery(quantityType: stepsHealth, quantitySamplePredicate: predicate, options: sumOption) {
query, results, error in
if let sumQuantity = results?.sumQuantity() {
dispatch_async(dispatch_get_main_queue(), {
stepCount = sumQuantity.doubleValueForUnit(stepsUnit) * 2
//Set UILabel Value
myLabel.text = String(stepCount)
})
}
}
healthKitStore?.executeQuery(stepsHealthDataQuery)
}
Run Code Online (Sandbox Code Playgroud)
而且你不需要返回任何东西.
如果要从函数返回步数,则需要使用闭包进行一些操作并修改函数,如下所示:
func getStepsHealthData(completion: (steps: Int) -> ()) {
var stepCount: Int = 0
let stepsUnit = HKUnit.countUnit()
let sumOption = HKStatisticsOptions.CumulativeSum
let stepsHealthDataQuery = HKStatisticsQuery(quantityType: stepsHealth, quantitySamplePredicate: predicate, options: sumOption) {
query, results, error in
if let sumQuantity = results?.sumQuantity() {
stepCount = sumQuantity.doubleValueForUnit(stepsUnit) * 2
completion(stepCount)
}
}
healthKitStore?.executeQuery(stepsHealthDataQuery)
}
Run Code Online (Sandbox Code Playgroud)
然后你可以从外面这样称呼它:
self.getStepsHealthData() { (steps) -> Void in
dispatch_async(dispatch_get_main_queue(), {
//Set UILabel Value
myLabel.text = String(stepCount)
})
}
Run Code Online (Sandbox Code Playgroud)我希望这对你有帮助.
| 归档时间: |
|
| 查看次数: |
605 次 |
| 最近记录: |