如何以渐进方式使用 Health Kit 样本查询

Posted

技术标签:

【中文标题】如何以渐进方式使用 Health Kit 样本查询【英文标题】:how to use health kit sample query in progressive ways 【发布时间】:2015-10-14 16:56:09 【问题描述】:

我真的想要执行HKSampleQuery 的结果。但是,执行查询后我总是无法立即得到结果。

我的情况如下(错误处理代码已删除):

let sortDescriptor = NSSortDescriptor(key: HKSampleSortIdentifierStartDate, ascending: false)

// get the latest step count sample
let stepSampleQuery: HKSampleQuery = HKSampleQuery(sampleType: (stepCountQty)!,
    predicate: nil,
    limit: 1,
    sortDescriptors: [sortDescriptor]) 
        (query, results, error) -> Void in

        if let result = results as? [HKQuantitySample] 
            // result[0] is the sample what I want
            self.lastStepDate = result[0].startDate
            print("readLastStep: ", self.lastStepDate)
        

self.healthStore.executeQuery(query)
// now, I want to use the "self.lastStepDate"
// But, I cannot get the appropriate value of the variable.

我认为代码不会逐步运行。 HKSampleQueryresultHandler 什么时候运行?我真的希望处理程序代码在我使用查询结果之前运行。

【问题讨论】:

【参考方案1】:

resultsHandler 运行时记录在HKSampleQuery reference 中:

实例化查询后,调用 HKHealthStore 类的 executeQuery:运行此查询的方法。查询以匿名方式运行 后台队列。查询完成后,结果 处理程序在后台队列上执行。您通常派遣 这些结果到主队列以更新用户界面。

由于查询是异步执行的,您应该执行取决于查询结果的工作,以响应调用resultsHandler。例如,您可以执行以下操作:

// get the latest step count sample
let stepSampleQuery: HKSampleQuery = HKSampleQuery(sampleType: (stepCountQty)!,
    predicate: nil,
    limit: 1,
    sortDescriptors: [sortDescriptor]) 
        (query, results, error) -> Void in

        if let result = results as? [HKQuantitySample] 
            // result[0] is the sample what I want
            dispatch_async(dispatch_get_main_queue()) 
               self.lastStepDate = result[0].startDate
               print("readLastStep: ", self.lastStepDate)

               self.doSomethingWithLastStepDate()
            
        

self.healthStore.executeQuery(query)

请注意,由于处理程序是在后台队列上调用的,因此我已经在主队列上完成了与 lastStepDate 相关的工作以避免同步问题。

【讨论】:

但是,我将在观察者查询中使用该变量,该变量将在后台执行。我知道 HKSampleQuery 不能在后台执行。如果我在self.doSomethingWithLastStepDate空间写了关于观察者查询的代码,我认为观察者查询不能在后台使用 我希望我的应用在后台运行。我的应用程序中的观察者查询甚至在后台检测 HealthKit 商店中的新样本。当观察者查询知道添加了一些样本时,我的应用程序应该比较最后一步日期和当前日期。 当您的应用在后台时,没有什么可以阻止查询的执行。 link 中的答案说“观察者查询的 updateHandler,您应该启动花药查询”但是,您的回答让我反转它,因为您的回答说我的观察者查询应该在示例查询中 resultHandler 的 HKSampleQuery 无法在后台执行

以上是关于如何以渐进方式使用 Health Kit 样本查询的主要内容,如果未能解决你的问题,请参考以下文章

以编程方式获取/刷新 Health Kit 数据?

以编程方式获取/刷新 Health Kit 数据?

华为 Health Kit API 未显示蛋白质值

如何使用 Health Kit 断开 Health App 的源?

如何使用 Health Kit 断开 Health App 的源?

Health Kit 数据详细信息