我需要我的应用程序在HealthKit和我们的数据库之间同步,而它在后台。我无法理解确定HKObserverQueries如何以及何时运行updateHandlers的逻辑。我需要各种不同样本类型的数据,所以我假设每个都需要一个观察者查询。对?
根据Apple关于函数enableBackgroundDeliveryForType的说法,“ HealthKit会在指定类型的新样本保存到商店时唤醒您的应用程序。”但是,如果我启用背景交付并执行观察者查询,例如血糖和体重,那么只要我在Health应用程序中的任何一个中输入数据,他们两者似乎都会运行他们的更新程序。即使我只为其中一个样本类型启用后台传递,这似乎也会发生。为什么呢?
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)
}
答案 0 :(得分:1)
如果您正在使用HealthKit的后台传递功能,那么您需要为您观察的每种类型的数据打开matches
并处理HKObserverQuery
的调用并调用提供的完成后完成。但是,updateHandler
updateHandler
是建议性的,并且调用不一定与HealthKit数据库的更改一一对应(可用的信息不足以确定您的应用已处理的内容以及它没有,所以有时处理程序可能会在没有新数据的情况下运行。
不要担心在HKObserverQuery
运行时准确理解或控制 - 只需将其用作执行其他查询的触发器,这些查询实际上会为您提供HealthKit的最新值。例如,如果您需要准确了解HealthKit中的哪些样本是新的,那么您的应用应使用updateHandler
。