在我的应用程序中,我想使用HKAnchoredObjectQuery获取HealthKit数据。我已经编写了返回添加和删除数据的代码,但是我想用UpdateHandler设置HKAnchoredObjectQuery,因此,当在HealthKit中添加/删除数据时,我会在应用程序中收到通知。

-(void)AnchoredObjectQueryTest
{
    HKSampleType *sampleType1 =
    [HKObjectType quantityTypeForIdentifier:HKQuantityTypeIdentifierBodyMass];

    HKAnchoredObjectQuery *query =
    [[HKAnchoredObjectQuery alloc]
     initWithType:sampleType1
     predicate:nil
     anchor: HKAnchoredObjectQueryNoAnchor
     limit:HKObjectQueryNoLimit
     resultsHandler:^(HKAnchoredObjectQuery * query,
                      NSArray<HKSample *> * sampleObjects,
                      NSArray<HKDeletedObject *> * deletedObjects,
                      HKQueryAnchor *newAnchor,
                      NSError * error) {

         if (error) {

             // Perform proper error handling here...
             NSLog(@"*** An error occured while performing the anchored object query. %@ ***",
                   error.localizedDescription);

             abort();
         }

       anchor = newAnchor;


         for (HKQuantitySample *sample in sampleObjects) {
             NSLog(@"Add : %@", sample);
         }

         for (HKDeletedObject *sample in deletedObjects) {
              NSLog(@"Delete : %@", sample);
         }


     }];


     [healthStore executeQuery:query];
}

最佳答案

实例化并执行您的HKAnchoredObjectQuery,它将运行一次,并调用处理程序参数中指定的块。

实例化查询并在查询上设置updateHandler 属性,然后执行查询。该查询像以前一样第一次运行,它返回您在实例化时提供的处理程序参数;当将结果添加或删除到存储中时,查询将随后运行,并回调给您的updateHandler。

就我而言,我对处理程序参数和updateHandler属性使用相同的块。

10-05 20:04