使用HKObserverQuery观察HealthKit数据的变化

时间:2014-06-12 22:36:18

标签: ios8

当我设置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)
}

编辑:只有在没有错误时才会调用已发现的完成处理程序,因此移入!错误块。未授权应用时出现错误。

1 个答案:

答案 0 :(得分:5)

是的,这是预期的行为。首次执行时将始终调用更新处理程序,以便您可以使用它来获取初始数据(从示例查询,锚定对象查询等)并填充UI。

只有在您打算使用后台交付时才需要完成处理程序,它会通知HealthKit您已收到并处理了所需的数据,以便HealthKit知道停止在后台启动您的应用程序。如果您尚未注册应用程序以进行后台交付,那么完成处理程序本质上是一个无操作程序,您无需担心它。