HKObserverQuery连续两次随机调用

时间:2014-12-30 02:30:08

标签: ios objective-c uiapplicationdelegate health-kit hkobserverquery

我有一个问题我试图解决,我设置了一个HKObserveryQuery,它运行良好,并为我收集新数据。

但问题是,有时当我手动将其添加到Health应用程序后返回Health应用程序并删除项目时,我注意到{I}已设置HKObserverQuery我试图解决两次非常紧密的联系,因为我使用这个观察者来后来上传一些数据,我不想要复制。

我很感激提供的任何帮助。代码:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    [self setup];

    return YES;
}

- (void)setup
{
    if ([HKHealthStore isHealthDataAvailable])
    {
        self.healthStore = [[HKHealthStore alloc]init];

        NSSet *readTypes = [NSSet setWithObject:[HKObjectType quantityTypeForIdentifier:HKQuantityTypeIdentifierHeartRate]];

        [self.healthStore requestAuthorizationToShareTypes:nil
                                                 readTypes:readTypes
                                                completion:^(BOOL success, NSError *error)
         {
             if (!error && success)
             {
                 [self observeHR];

                 [self.healthStore enableBackgroundDeliveryForType:
                 [HKQuantityType quantityTypeForIdentifier:HKQuantityTypeIdentifierHeartRate]
                 frequency:HKUpdateFrequencyImmediate withCompletion:^(BOOL success, NSError *error){}];
             }
         }];
    }
}

- (void)observeHR
{
    HKObserverQuery *query = [[HKObserverQuery alloc]initWithSampleType:[HKSampleType quantityTypeForIdentifier:HKQuantityTypeIdentifierHeartRate]
                        predicate:nil
    updateHandler:^(HKObserverQuery *query, HKObserverQueryCompletionHandler completionHandler, NSError *error)
    {
        if (!error)
        {   
            // Randomly called twice *VERY* close together
            NSLog(@"Query");
            [self queryWithCompletionHandler:completionHandler];
        }
        else
        {
            if (completionHandler)
            {
                completionHandler();
            }
        }
    }];

    [self.healthStore executeQuery:query];
}

控制台输出,注意时间:当只从Health应用程序中删除一个项目时,会发生这种情况,这是不正确的。

2014-12-29 16:50:20.121 TestApp[174:5674] Query
2014-12-29 16:50:20.124 TestApp[174:5674] Query

2 个答案:

答案 0 :(得分:4)

您不应该为任何特定事件设计一个依赖updateHandler HKObserverQuery updateHandler的系统。将HKAnchoredObjectQuery的调用视为表示可能已添加或删除与谓词匹配的任意数量的样本。您可以执行查询以发现更改的内容。例如,如果您只对匹配谓词的新样本感兴趣,则可以使用{{1}}仅检索尚未处理的样本。

答案 1 :(得分:2)

我相信我现在通过设置BOOL标志来解决问题,以防止调用第二个伪造的HKObserverQuery,并且无缘无故地消除重复处理。代码:

- (void)observeHR
{
    HKObserverQuery *query = [[HKObserverQuery alloc]initWithSampleType:[HKSampleType quantityTypeForIdentifier:HKQuantityTypeIdentifierHeartRate]
                        predicate:nil
    updateHandler:^(HKObserverQuery *query, HKObserverQueryCompletionHandler completionHandler, NSError *error)
    {
        if (!self.queryInProgress)
        {
            self.queryInProgress = YES;

            if (!error)
            {
                [self queryWithCompletionHandler:completionHandler];
            }
            else
            {
                self.queryInProgress = NO;

                if (completionHandler)
                {
                    completionHandler();
                }
            }
        }
        else
        {
            NSLog(@"Query already in progress");
        }
    }];

    [self.healthStore executeQuery:query];
}