swift apple healthkit查询是否异步运行?

wxclj1h5  于 2023-01-04  发布在  Swift
关注(0)|答案(1)|浏览(165)

HKStatisticsQueryHKSampleQueryHKStatisticsCollectionQuery这样的apple healthkit查询是异步运行的,还是需要在一个单独的线程中显式运行这些查询?
我只是用下面的异步方式编写了查询,它工作正常。我想知道我是否应该把它放在一个异步块中

private func readOxygrnSaturation(){
        dispatchGroup.enter()
        let quantityType  = HKObjectType.quantityType(forIdentifier: .oxygenSaturation)!
        let sampleQuery = HKSampleQuery.init(sampleType: quantityType,
                                             predicate: nil,
                                             limit: HKObjectQueryNoLimit,
                                             sortDescriptors: nil,
                                             resultsHandler: { (query, results, error) in
            
            guard let samples = results as? [HKQuantitySample] else {
                print(error!)
                return
            }
            for sample in samples {
                let mSample = sample.quantity.doubleValue(for: HKUnit(from: "%"))
                self.oxygenSaturation.append(HealthData(unit: "%", startDate: self.dateFormatter.string(from: sample.startDate) , endDate: self.dateFormatter.string(from: sample.endDate), value: mSample))
            }
            self.dispatchGroup.leave()
        })
        self.healthStore .execute(sampleQuery)
        
    }
y53ybaqx

y53ybaqx1#

在iOS上,HealthKit查询是异步运行的,不需要在单独的线程中运行。
若要执行HealthKit查询,您将创建一个HKQuery对象,然后调用HKHealthStore方法execute(_:)来执行查询。此方法立即返回,查询结果将通过您提供的完成处理程序返回给您。
以下是如何执行HKStatisticsQuery的示例:

let healthStore = HKHealthStore()

let query = HKStatisticsQuery(quantityType: quantityType, quantitySamplePredicate: predicate, options: .cumulativeSum) { (query, result, error) in
    guard let result = result, let sum = result.sumQuantity() else {
        // handle the error
        return
    }

    // use the result
}

healthStore.execute(query)

此代码创建一个HKStatisticsQuery对象,然后通过调用HKHealthStore的execute(_:)方法来执行该对象。完成处理程序作为HKStatisticsQuery初始值设定项的闭包提供,并在查询完成执行时调用该处理程序。

相关问题