当我设置一个HKObserverQuery时,更新处理程序总是会立即被调用(这是我没有想到的)。当我通过Health.app添加数据点时,它也会被调用,正如您所期望的那样。我倾向于认为我没有对完成处理程序做正确的事情,但是对于这里应该发生的事情,文档非常稀少。
问题:下面基本上是我正在做的事情。这是预期的行为,还是我遗漏了什么?
func listenForUpdates() {
let bodyMassType = HKQuantityType.quantityTypeForIdentifier(HKQuantityTypeIdentifierBodyMass)
let updateHandler: (HKObserverQuery!, HKObserverQueryCompletionHandler!, NSError!) -> Void = { query, completion, error in
if !error {
println("got an update")
// ... perform a sample query to get the actual data
completion() // is this the right thing to do?
} else {
println("observer query returned error: \(error)")
}
}
let query = HKObserverQuery(sampleType: bodyMassType, predicate: nil, updateHandler: updateHandler)
healthStore?.executeQuery(query)
}编辑:只有在没有错误时才应该调用已发现的完成处理程序,因此移到了错误块中。当应用程序未被授权时会出现错误。
发布于 2014-06-21 22:33:56
是的,这是预期的行为。在第一次执行时总是会调用更新处理程序,以便您可以使用它来获取初始数据(从示例查询、锚定对象查询等)并填充UI。
只有当您打算使用后台传递时,完成处理程序才是必要的,它通知HealthKit您已经收到并处理了所需的数据,以便HealthKit知道停止在后台启动应用程序。如果您没有注册您的应用程序的背景传递,那么完成处理程序本质上是一个不操作,您不需要担心它。
https://stackoverflow.com/questions/24194960
复制相似问题