如何以渐进方式使用 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.
我认为代码不会逐步运行。 HKSampleQuery
的 resultHandler
什么时候运行?我真的希望处理程序代码在我使用查询结果之前运行。
【问题讨论】:
【参考方案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 App 的源?