我试图让我的应用程序在观察到新数据输入时将 HealthKit 数据与我们的数据库同步。尽管逻辑上有些含糊之处 https://stackoverflow.com/questions/37986435/whats-the-logic-in-hkobserverquery-background-delivery我相信我已经成功地启用了样本类型的后台交付,并让观察者在需要时做出反应。
但是,在观察者的更新处理程序中,我需要创建一个HKAnchoredObjectQuery
用于从 HealthKit 获取最新结果,但当我的应用程序在后台运行时,这些查询不会可靠地返回。通常,当我在 HealthKit 中添加样本点时,锚定查询就会被执行,但只有当我将应用程序带回到前台时,它们才会返回。
其他时候,他们会立即返回,而无需我激活应用程序。一个可能的问题是我的所有观察者查询都会触发其更新处理程序,从而创建多个可能返回也可能不返回的 AnchoredObjectQueries。我已经在链接的线程中进一步解释了这一点,因为它可能不相关。
这是我从 HKObserverQuery 的 updatehandler 调用的函数的示例:
func synchronizeRecentData(sampleType: HKSampleType, observerQuery: HKObserverQuery) {
let completionHandler: (HKAnchoredObjectQuery, [HKSample]?, Int, NSError?) -> Void = {
[unowned self] query, results, newAnchor, error in
if error != nil {
abort()
}
// Update queryAnchor
self.queryAnchors[sampleType] = newAnchor
guard let receivedNewSamples = results as? [HKQuantitySample] else {
abort()
}
// Handle received samples here
}
let query = HKAnchoredObjectQuery(type: sampleType,
predicate: nil,
anchor: self.queryAnchors[sampleType]!,
limit: HKObjectQueryNoLimit,
completionHandler: completionHandler)
healthKitStore.executeQuery(query)
}