HKObserverQuery后台交付的逻辑是什么?

时间:2016-06-23 08:42:43

标签: ios swift health-kit

我需要我的应用程序在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)

}

1 个答案:

答案 0 :(得分:1)

如果您正在使用HealthKit的后台传递功能,那么您需要为您观察的每种类型的数据打开matches并处理HKObserverQuery的调用并调用提供的完成后完成。但是,updateHandler updateHandler是建议性的,并且调用不一定与HealthKit数据库的更改一一对应(可用的信息不足以确定您的应用已处理的内容以及它没有,所以有时处理程序可能会在没有新数据的情况下运行。

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