2

我真的想要执行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.

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

4

1 回答 1

1

resultsHandler运行记录在HKSampleQuery 参考中时:

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

于 2015-10-14T20:45:23.697 回答