所以根据苹果的说法,我需要在从添加到 HK 的数据触发updateHandler
后调用HKObserverQueryCompletionHandler
。
但是一旦我调用 completionHandler,观察者查询就会停止在后台提供更多更新。
这是我的代码:
guard let sampleType = sample as? HKQuantityType else { return nil }
let query = HKObserverQuery(sampleType: sampleType, predicate: nil, updateHandler: { query, completionHandler, error in
completionHandler()
IamExecutingHKStatisticsCollectionQueryHere()
})
healthStore?.execute(query)
healthStore?.enableBackgroundDelivery(for: sampleType, frequency: .hourly, withCompletion: { success, error in
})
如果我不调用 completionHandler,一切正常,但我从未长时间测试过。
调用completionHandler()
表示您已完成处理新数据。仅在处理了为响应被调用updateHandler
而执行的查询结果后调用它。如果您像现在这样提前调用completionHandler()
,系统将在您有机会处理数据之前停止在后台运行您的应用程序。
您必须调用 completionHandler,否则将不会调用 updateHandler。
参考: https://developer.apple.com/documentation/healthkit/hkobserverquerycompletionhandler
"你必须在处理完传入数据后立即调用这个块。调用此块会告知 HealthKit 您已成功接收后台数据。如果不调用此块,HealthKit 将继续尝试使用退避算法启动您的应用程序。如果您的应用三次无法响应,HealthKit 将假定您的应用无法接收数据,并停止向您发送后台更新。