首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >HealthKit HKObserverQuery触发不一致

HealthKit HKObserverQuery触发不一致
EN

Stack Overflow用户
提问于 2020-10-28 16:50:41
回答 1查看 99关注 0票数 0

我正在构建一个应用程序,它应该可以使用HKObserverQuery监听新添加的心率数据在HealthKit中的变化,但奇怪的是,当我使用断点和控制台日志进行调试并手动向HealthKit添加新数据时,观察者的updateHandler块并不能一致地触发。

下面是大部分代码:

代码语言:javascript
复制
import HealthKit

protocol HeartRateDataProviding {
    var delegate: HeartRateDataProviderDelegate? { get set }
    func startExecutingQuery(until: Date?)
}

protocol HeartRateDataProviderDelegate: class {
    func didQueryData(entry: HeartRateDataEntry)
}

struct HeartRateDataEntry {
    let date: Date
    let value: Int
}

class HeartRateDataProvider: HeartRateDataProviding {
    private let healthStore: HKHealthStore
    private let heartRateType = HKQuantityType.quantityType(forIdentifier: HKQuantityTypeIdentifier.heartRate)!
    private let heartRateUnit = HKUnit(from: "count/min")
    weak var delegate: HeartRateDataProviderDelegate?

    init(healthStore: HKHealthStore = .init()) {
        self.healthStore = healthStore
    }

    func startExecutingQuery() {
        healthStore.enableBackgroundDelivery(for: heartRateType, frequency: .immediate) { success, error in
            print("Observer Query background delivery enabled -> successful: \(success) error: \(String(describing: error))")
        }
        healthStore.execute(self.createObserverQuery())
    }

    private func createObserverQuery() -> HKQuery {
        let query = HKObserverQuery(sampleType: heartRateType, predicate: nil) { query, completionHandler, error in
            print("Hello!")
            completionHandler()
        }

        return query
    }

    private func formatSamples(samples: [HKSample]?) {
        guard let samples = samples as? [HKQuantitySample],
              let sample = samples.last else { return }

        let entry = HeartRateDataEntry(date: sample.endDate,
                                       value: Int(sample.quantity.doubleValue(for: heartRateUnit)))
        delegate?.didQueryData(entry: entry)
    }
}

我在我的AppDelegate中有一个该类的实例,并在didFinishLaunchingWithOptions上执行查询。

查询的updateHandler块只会在我设置它时触发一次,当应用程序进入前台时,如果我将应用程序放在后台,转到健康应用程序并尝试添加新数据,行为会非常不一致。有趣的是,如果我从来没有像苹果文档中建议的那样调用completionHandler,那么这个模块大约会正确触发5-6次,如果我调用completionHandler,那么它可能每5次尝试就会工作一次。我计划使用HKAnchoredObjectQuery来获取我尝试过的最后一个数据,当观察者触发时,它工作得很好,但我无法让观察者正常工作。

我是不是遗漏了什么?如果能得到一些帮助,我们将不胜感激。

更新:出于测试目的,我已经将数据类型更改为bloodGlucose,并注意到updateHandler每次都会正确触发,这让我认为我实现的代码是正确的,行为会因数据类型而异,有人能确认这一点吗?

EN

回答 1

Stack Overflow用户

发布于 2021-05-28 02:46:17

根据苹果文档(https://developer.apple.com/documentation/healthkit/hkhealthstore/1614175-enablebackgrounddelivery#discussion):“一些数据类型,比如步数,最低频率是HKUpdateFrequency.hourly。这个频率是透明执行的。”

因此,是的,它确实取决于频率和某些数据类型的数据类型,即使您包括频率作为立即数。也就是说,我在触发心率的HKObserverQuery时遇到了一些问题,所以我不能完全确定频率是否可靠(观察者任务可能有超时)。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64569336

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档