gpt4 book ai didi

ios - 来自 HealthKit 的数据最初丢失,然后在我再次尝试时出现 - 如何修复?

转载 作者:可可西里 更新时间:2023-11-01 01:35:37 25 4
gpt4 key购买 nike

我有一个用 Swift 开发的 iOS 应用程序,作为该应用程序的一部分,它会收集当天的步数。

我第一次运行该应用程序时,计数为“0”,但如果我在界面中单击一个按钮以重新运行此查询 HK 的函数,则会出现正确的数字。

我猜这是因为 HK 需要一些时间来收集数据之类的,但我不确定如何修复它。也许 HK 可以在数据准备好时触发一个事件,然后我可以更新 UI?

下面是从 HK 收集数据的例程。该函数在应用程序启动时立即执行(它显示“今天 0 步”),然后如上所述,我可以点击一个按钮再次执行该函数(然后我得到正确的数字)。

    func queryStepsSum() {
// prepare HK for the data
let endDate = NSDate() // right now
let startDate = NSCalendar.currentCalendar().dateBySettingHour(0, minute: 0, second: 0, ofDate: endDate, options: NSCalendarOptions())
let predicate = HKQuery.predicateForSamplesWithStartDate(startDate, endDate: endDate, options: .None)
let sumOption = HKStatisticsOptions.CumulativeSum
let statisticsSumQuery = HKStatisticsQuery( quantityType: self.stepsCount!, quantitySamplePredicate: predicate,
options: sumOption)
{ [unowned self] (query, result, error) in
if let sumQuantity = result?.sumQuantity() {
self.numberOfSteps = Int(sumQuantity.doubleValueForUnit(HKUnit.countUnit()))
}
}

// run the HK query
self.healthStore?.executeQuery(statisticsSumQuery)

// update the UI with the result
dispatch_async(dispatch_get_main_queue(), { () -> Void in
self.stepsLabel.text = "\(self.numberOfSteps) steps today";
});
}

最佳答案

您的代码在显示结果之前不会等待查询完成(查询异步发生)。您应该从查询的结果处理程序更新您的 UI,如下所示:

    let statisticsSumQuery = HKStatisticsQuery( quantityType: self.stepsCount!, quantitySamplePredicate: predicate,
options: sumOption)
{ [unowned self] (query, result, error) in
dispatch_async(dispatch_get_main_queue()) {
if let sumQuantity = result?.sumQuantity() {
self.numberOfSteps = Int(sumQuantity.doubleValueForUnit(HKUnit.countUnit()))
self.stepsLabel.text = "\(self.numberOfSteps) steps today";
}
}
}

另请注意,由于查询结果处理程序在后台线程上运行,并且在该上下文中操作 UI 是不安全的,因此我已经将调度返回到主线程。

关于ios - 来自 HealthKit 的数据最初丢失,然后在我再次尝试时出现 - 如何修复?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38078283/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com