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】:您不应该设计一个依赖于updateHandler
的HKObserverQuery
为任何特定事件仅触发一次的系统。将updateHandler
的调用简单地视为可能已添加或删除与谓词匹配的任意数量的样本的指示。您可以执行查询以发现发生了什么变化。例如,如果您只对与谓词匹配的新样本感兴趣,则可以使用HKAnchoredObjectQuery
仅检索您尚未处理的样本。
【讨论】:
当然,我同意。但我很好奇为什么这是双重射击。以上是关于HKObserverQuery 连续两次随机调用的主要内容,如果未能解决你的问题,请参考以下文章
两次调用 avformat_find_stream_info() 崩溃