HKObserverQuery后台传递的逻辑是什么?

我需要我的应用程序在HealthKit和我们的数据库之间进行同步。 我只是无法将自己的头围绕在确定HKObserverQueries如何以及何时运行updateHandlers的逻辑上。 我需要各种不同的样本types的数据,所以我假设我需要每个人的观察员查询。 对?

根据苹果关于functionenableBackgroundDeliveryForType,“ HealthKit唤醒您的应用程序,每当指定types的新样本保存到商店” 。 但是,如果我启用后台交付和执行观察者查询血糖和体重,他们似乎运行更新处理程序,只要我在健康应用程序中的任何一个input数据。 即使在仅为其中一种样本types启用后台交付时,这也会发生。 为什么?

func startObserving(completion: ((success: Bool) -> Void)!) { let sampleTypeBloodGlucose = HKObjectType.quantityTypeForIdentifier(HKQuantityTypeIdentifierBloodGlucose)! let sampleTypeWeight = HKObjectType.quantityTypeForIdentifier(HKQuantityTypeIdentifierBodyMass)! // Enable background delivery for blood glucose self.healthKitStore.enableBackgroundDeliveryForType(sampleTypeBloodGlucose, frequency: .Immediate) { (success, error) in if error != nil { abort() } } // Enable background delivery for weight self.healthKitStore.enableBackgroundDeliveryForType(sampleTypeWeight, frequency: .Immediate) { (success, error) in if error != nil { abort() } } // Define update handlers for background deliveries let updateHandlerBloodGlucose: (HKObserverQuery, HKObserverQueryCompletionHandler, NSError?) -> Void = { query, completionHandler, error in if error != nil { abort() } // Handle data and call the completionHandler completionHandler() } let updateHandlerWeight: (HKObserverQuery, HKObserverQueryCompletionHandler, NSError?) -> Void = { query, completionHandler, error in if error != nil { abort() } // Handle data and call the completionHandler completionHandler() } let observerQueryBloodGlucose = HKObserverQuery(sampleType: sampleTypeBloodGlucose, predicate: nil, updateHandler: updateHandlerBloodGlucose) healthKitStore.executeQuery(observerQueryBloodGlucose) let observerQueryWeight = HKObserverQuery(sampleType: sampleTypeWeight, predicate: nil, updateHandler: updateHandlerWeight) healthKitStore.executeQuery(observerQueryWeight) completion(success: true) } 

如果您正在使用HealthKit的后台传递function,那么是的,您需要为您观察的每种数据types打开一个HKObserverQuery ,并处理updateHandler的调用,并在完成后调用提供的完成。 然而, updateHandlerHKObserverQuery是咨询性的,调用并不一定与HealthKit数据库的变化一一对应(并不总是有足够的信息来确定你的应用程序已经处理了什么,没有足够的信息,所以有时候处理程序可能在没有新数据时运行)。

updateHandler运行时,不要担心精确的理解或控制,只要将其用作执行其他查询的触发器,这些查询实际上会为您提供HealthKit的最新值。 例如,如果您需要确切知道HealthKit中的哪些样本是新的,那么您的应用程序应该使用HKAnchoredObjectQuery