1

我使用 HKAnchoredObjectQuery 和 updateHandler 来获取多种类型的 healthkit 样本数据,但它只返回“HKQuantityTypeIdentifierStepCount”的数据,而不是其他 HKSampleTypes。下面是我正在使用的代码。任何帮助将非常感激。

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
        
        
    }}
4

2 回答 2

3

这是意料之中的。查询的初始化程序采用类型参数,仅返回该类型的结果。您无法通过单个查询查询多种类型的样本。

于 2016-05-20T13:33:40.187 回答
0

您可以使用适用于 iOS 15.0 及更高版本的此 init。

init(queryDescriptors: [HKQueryDescriptor], 
anchor: HKQueryAnchor?, 
limit: Int, 
resultsHandler handler: @escaping (HKAnchoredObjectQuery, [HKSample]?, [HKDeletedObject]?, HKQueryAnchor?, Error?) -> Void)
于 2022-02-20T13:53:52.883 回答