gpt4 book ai didi

ios - HKObserverQuery 连续两次随机调用

转载 作者:可可西里 更新时间:2023-11-01 05:28:33 25 4
gpt4 key购买 nike

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

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

最佳答案

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

关于ios - HKObserverQuery 连续两次随机调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27698876/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com