Ios8 使用HKObserverQuery观察HealthKit数据的变化

Ios8 使用HKObserverQuery观察HealthKit数据的变化,ios8,Ios8,当我设置HKObserverQuery时,总是会立即调用更新处理程序(这是我没有预料到的)。正如您所料,当我通过Health.app添加数据点时,它也会被调用。我倾向于认为我在完成处理程序方面做得不对,但是文档中关于应该发生什么的内容非常少 问题:下面是我正在做的事情。这是预期的行为,还是我遗漏了什么? func listenForUpdates() { let bodyMassType = HKQuantityType.quantityTypeForIdentifier(HKQuant

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

编辑:仅当没有错误时才应调用发现的完成处理程序,因此将其移至!错误块。应用未经授权时出现错误

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


只有当您打算使用后台交付时,才需要完成处理程序,它会通知HealthKit您已收到并处理了所需的数据,以便HealthKit知道停止在后台启动您的应用程序。如果你还没有为后台交付注册你的应用程序,那么完成处理程序本质上是一个no-op,你不需要担心它

贾斯汀,谢谢你的回复。非常感谢。嘿,贾斯汀。你似乎对Healthkit很了解。在@jaydfwtx提供的示例中,添加后台支持缺少什么?通常,我希望在应用程序处于后台(或被杀死)时收到通知。请查看HKHealthStore.enableBackgroundDeliveryForType。您启用后台传递,然后执行观察者查询。您对enableBackgroundDeliveryForType有任何问题吗?在我的4s上,它工作得很好,但在我的5s上,我只定期更新我观察到的健康数据的变化。@jaydfwtx当你的应用程序在后台时,你们两人是否能够可靠地启动observer查询?我只是在应用程序后台运行几秒钟后才得到它们。它们似乎只有在应用程序再次前景化时才能可靠地到达。是一个devforums的帖子,其他人似乎也有类似的问题。