如何以渐进的方式使用健康工具包样本查询

时间:2015-10-14 16:56:09

标签: ios swift ios9 health-kit hksamplequery

我真的希望执行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.

我不认为代码会逐渐运行。 resultHandler的{​​{1}}何时运行?我真的希望在使用查询结果之前运行处理程序代码。

1 个答案:

答案 0 :(得分:1)

HKSampleQuery reference

中记录了运行resultsHandler的情况
  

实例化查询后,调用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相关的工作,以避免同步问题。