当我设置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)
}
编辑:只有在没有错误时才会调用已发现的完成处理程序,因此移入!错误块。未授权应用时出现错误。
答案 0 :(得分:5)
是的,这是预期的行为。首次执行时将始终调用更新处理程序,以便您可以使用它来获取初始数据(从示例查询,锚定对象查询等)并填充UI。
只有在您打算使用后台交付时才需要完成处理程序,它会通知HealthKit您已收到并处理了所需的数据,以便HealthKit知道停止在后台启动您的应用程序。如果您尚未注册应用程序以进行后台交付,那么完成处理程序本质上是一个无操作程序,您无需担心它。