HKObserverQuery 连续两次随机调用

Posted

技术标签:

【中文标题】HKObserverQuery 连续两次随机调用【英文标题】:HKObserverQuery randomly called twice in a row 【发布时间】:2014-12-30 02:30:07 【问题描述】:

我有一个要解决的问题,我设置了一个HKObserveryQuery,它非常有效,可以为我收集新数据。

但问题是,有时当我手动将项目添加到 Health 应用程序后返回 Health 应用程序并删除它时,我注意到 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];

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

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

【问题讨论】:

【参考方案1】:

我相信我现在已经解决了这个问题,方法是设置一个 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];

【讨论】:

我很好奇为什么需要这样做。我正在经历同样的事情,我想避免对我的存储和处理系统造成任何过度负载。你找到它双发的路径原因了吗? 嘿,您有任何解决此双重查询触发问题的方法。在我的情况下,我面临同样的问题。请尽快分享。【参考方案2】:

您不应该设计一个依赖于updateHandlerHKObserverQuery 为任何特定事件仅触发一次的系统。将updateHandler 的调用简单地视为可能已添加或删除与谓词匹配的任意数量的样本的指示。您可以执行查询以发现发生了什么变化。例如,如果您只对与谓词匹配的新样本感兴趣,则可以使用HKAnchoredObjectQuery 仅检索您尚未处理的样本。

【讨论】:

当然,我同意。但我很好奇为什么这是双重射击。

以上是关于HKObserverQuery 连续两次随机调用的主要内容,如果未能解决你的问题,请参考以下文章

两次调用 avformat_find_stream_info() 崩溃

一个Dubbo服务方法被连续调用了两次,这是怎么回事

为啥有时在计时器滴答事件中它会连续两次调用该方法?

当在 2 个连续的行中调用两次时,Faker 正在生成重复数据(Typescript)

AFN的实时网络监控 但是block连续调用了两次

如何在一个具有不同参数的连续调用两次的javascript中为函数添加回调?