gpt4 book ai didi

ios - HKObserverQuery后台转换的逻辑是什么?

转载 作者:可可西里 更新时间:2023-11-01 02:16:29 31 4
gpt4 key购买 nike

我需要我的应用在后台同步 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)

}

最佳答案

如果您正在使用 HealthKit 的后台传送功能,那么是的,您确实需要打开 HKObserverQuery对于您观察和处理的每种数据类型的调用 updateHandler完成后调用提供的完成。然而,updateHandlerHKObserverQuery是建议性的,调用不一定与 HealthKit 数据库的更改一一对应(并不总是有足够的信息可用于确定您的应用程序已处理和未处理的信息,因此有时处理程序可能会在没有信息时运行't 新数据)。

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

关于ios - HKObserverQuery后台转换的逻辑是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37986435/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com