Healthkit 多个 HKAnchoredObjectQuery 未返回所有样本类型的数据
Healthkit multiple HKAnchoredObjectQuery not returning data for all sample types
我正在使用 HKAnchoredObjectQuery 和 updateHandler 来获取多种类型的 healthkit 示例数据,但它 returns 数据仅适用于“HKQuantityTypeIdentifierStepCount”,不适用于其他 HKSampleType。下面是我正在使用的代码。任何帮助将不胜感激。
func readHealthKitData(type: HKSampleType) {
let onAnchorQueryResults : ((HKAnchoredObjectQuery, [HKSample]?, [HKDeletedObject]?, HKQueryAnchor?, NSError?) -> Void)! = {
(query:HKAnchoredObjectQuery, addedObjects:[HKSample]?, deletedObjects:[HKDeletedObject]?, newAnchor:HKQueryAnchor?, nsError:NSError?) -> Void in
if (addedObjects?.count > 0)
{
// var addDict = [String : AnyObject]()
for obj in addedObjects! {
let hkValue = obj as? HKQuantitySample
if(hkValue?.UUID.UUIDString != nil){
print("TypeName:",type.isEqual("HKQuantityTypeIdentifierHeartRate"))
switch type {
case HKQuantityType.quantityTypeForIdentifier(HKQuantityTypeIdentifierHeartRate)!:
let val = (hkValue?.quantity.doubleValueForUnit(HKUnit(fromString: "count/min")))!
let uuid : String = (hkValue?.UUID.UUIDString)!
case HKSampleType.quantityTypeForIdentifier(HKQuantityTypeIdentifierStepCount)!:
let val = (hkValue?.quantity.doubleValueForUnit(HKUnit.countUnit()))!
let uuid : String = (hkValue?.UUID.UUIDString)!
case HKObjectType.quantityTypeForIdentifier(HKQuantityTypeIdentifierBodyMass)!:
let val = ((hkValue?.quantity.doubleValueForUnit(HKUnit.gramUnit()))!/1000.0)
let uuid : String = (hkValue?.UUID.UUIDString)!
default:
break
}
}
}
}
}
let queryEndDate = NSDate()
print("Before Start: ")
print(self.queryStartDate)
let predicate: NSPredicate = HKAnchoredObjectQuery.predicateForSamplesWithStartDate(self.queryStartDate, endDate: queryEndDate, options: HKQueryOptions.None)
let anchoredQuery = HKAnchoredObjectQuery(type: type, predicate: predicate, anchor: hkAnchor, limit: 0, resultsHandler: onAnchorQueryResults)
anchoredQuery.updateHandler = onAnchorQueryResults
healthStore.executeQuery(anchoredQuery)
self.queryStartDate = queryEndDate
}}
这是意料之中的。查询的初始化程序仅采用类型参数 returns 该类型的结果。您不能通过单个查询查询多种类型的样本。
您可以使用适用于 iOS 15.0 及更高版本的初始化程序。
init(queryDescriptors: [HKQueryDescriptor],
anchor: HKQueryAnchor?,
limit: Int,
resultsHandler handler: @escaping (HKAnchoredObjectQuery, [HKSample]?, [HKDeletedObject]?, HKQueryAnchor?, Error?) -> Void)
我正在使用 HKAnchoredObjectQuery 和 updateHandler 来获取多种类型的 healthkit 示例数据,但它 returns 数据仅适用于“HKQuantityTypeIdentifierStepCount”,不适用于其他 HKSampleType。下面是我正在使用的代码。任何帮助将不胜感激。
func readHealthKitData(type: HKSampleType) {
let onAnchorQueryResults : ((HKAnchoredObjectQuery, [HKSample]?, [HKDeletedObject]?, HKQueryAnchor?, NSError?) -> Void)! = {
(query:HKAnchoredObjectQuery, addedObjects:[HKSample]?, deletedObjects:[HKDeletedObject]?, newAnchor:HKQueryAnchor?, nsError:NSError?) -> Void in
if (addedObjects?.count > 0)
{
// var addDict = [String : AnyObject]()
for obj in addedObjects! {
let hkValue = obj as? HKQuantitySample
if(hkValue?.UUID.UUIDString != nil){
print("TypeName:",type.isEqual("HKQuantityTypeIdentifierHeartRate"))
switch type {
case HKQuantityType.quantityTypeForIdentifier(HKQuantityTypeIdentifierHeartRate)!:
let val = (hkValue?.quantity.doubleValueForUnit(HKUnit(fromString: "count/min")))!
let uuid : String = (hkValue?.UUID.UUIDString)!
case HKSampleType.quantityTypeForIdentifier(HKQuantityTypeIdentifierStepCount)!:
let val = (hkValue?.quantity.doubleValueForUnit(HKUnit.countUnit()))!
let uuid : String = (hkValue?.UUID.UUIDString)!
case HKObjectType.quantityTypeForIdentifier(HKQuantityTypeIdentifierBodyMass)!:
let val = ((hkValue?.quantity.doubleValueForUnit(HKUnit.gramUnit()))!/1000.0)
let uuid : String = (hkValue?.UUID.UUIDString)!
default:
break
}
}
}
}
}
let queryEndDate = NSDate()
print("Before Start: ")
print(self.queryStartDate)
let predicate: NSPredicate = HKAnchoredObjectQuery.predicateForSamplesWithStartDate(self.queryStartDate, endDate: queryEndDate, options: HKQueryOptions.None)
let anchoredQuery = HKAnchoredObjectQuery(type: type, predicate: predicate, anchor: hkAnchor, limit: 0, resultsHandler: onAnchorQueryResults)
anchoredQuery.updateHandler = onAnchorQueryResults
healthStore.executeQuery(anchoredQuery)
self.queryStartDate = queryEndDate
}}
这是意料之中的。查询的初始化程序仅采用类型参数 returns 该类型的结果。您不能通过单个查询查询多种类型的样本。
您可以使用适用于 iOS 15.0 及更高版本的初始化程序。
init(queryDescriptors: [HKQueryDescriptor],
anchor: HKQueryAnchor?,
limit: Int,
resultsHandler handler: @escaping (HKAnchoredObjectQuery, [HKSample]?, [HKDeletedObject]?, HKQueryAnchor?, Error?) -> Void)