我有一个问题,我想解决,我已经设置了一个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];
}控制台输出,注意时间:这发生在只删除Health中的一个项目时,这是不正确的。
2014-12-29 16:50:20.121 TestApp[174:5674] Query
2014-12-29 16:50:20.124 TestApp[174:5674] Query发布于 2014-12-30 05:54:48
我相信我现在已经通过设置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];
}发布于 2014-12-31 17:45:22
您不应该为任何特定事件设计一个依赖于updateHandler of HKObserverQuery触发一次的系统。将对updateHandler的调用简单地视为与谓词匹配的任意数量的示例可能已被添加或删除的指示。这取决于您执行一个查询来发现更改了什么。例如,如果您只对匹配谓词的新示例感兴趣,则可以使用HKAnchoredObjectQuery检索尚未处理的样本。
https://stackoverflow.com/questions/27698876
复制相似问题