2016-03-29 3 views
0

Я написал код, чтобы получить значения сердечного ритма из набора для здоровья. Код работает нормально, но когда новые значения сердца обновляются в наборе здоровья. Я должен зайти на главный экран, а затем многозадачное приложение, чтобы получить обновленные результаты. Моя цель - получить обновленный результат в моем приложении без повторного открытия или многозадачности, пожалуйста, помогите, поскольку я новичок в разработке iOS. Мой код: -Обработчик обновления HKAnchoredQuery не работает должным образом

-(void)get_heartRates 
{ 

//code to get the updated heart beats 

HKSampleType *sampleType = 
[HKObjectType quantityTypeForIdentifier:HKQuantityTypeIdentifierHeartRate]; 

HKObserverQuery *query = 
[[HKObserverQuery alloc] 
initWithSampleType:sampleType 
predicate:nil 
updateHandler:^(HKObserverQuery *query, 
       HKObserverQueryCompletionHandler completionHandler, 
       NSError *error) { 

    if (error) { 


     NSLog(@"error occured while setting observer. %@ ", 
       error.localizedDescription); 
     abort(); 
    } 

    // Take whatever steps are necessary to update your app's data and UI 
    // This may involve executing other queries 


    [self executeAnchoredQuery]; 

    // If you have subscribed for background updates you must call the completion handler here. 
    // completionHandler(); 

}]; 

[self.healthStore executeQuery:query]; 
} 

-(void)executeAnchoredQuery 
{ 

NSDate *startDate1 = [NSDate distantPast]; 
NSPredicate *Predicate = [HKQuery  predicateForSamplesWithStartDate:startDate1 endDate:[NSDate date] options:HKQueryOptionStrictEndDate]; 
HKSampleType *object = [HKSampleType quantityTypeForIdentifier:HKQuantityTypeIdentifierHeartRate]; 

sum_Of_HeartRates=0.0; 

HKAnchoredObjectQuery *heartQuery = [[HKAnchoredObjectQuery alloc] initWithType:object predicate:Predicate anchor:self.lastAnchor limit:0 resultsHandler:^(HKAnchoredObjectQuery *query, NSArray<HKSample *> *sampleObjects, NSArray<HKDeletedObject *> *deletedObjects, HKQueryAnchor *newAnchor, NSError *error) { 

    NSLog(@"Sample counts:%ld",sampleObjects.count); 
    for(int i=0;i<(int)sampleObjects.count;i++) 
    { 

     HKQuantitySample *sample = (HKQuantitySample *)[sampleObjects objectAtIndex:i]; 
     HKQuantity *quantity = sample.quantity; 
     double bpm_Values= [quantity doubleValueForUnit:[HKUnit unitFromString:@"count/min"]]; 
     sum_Of_HeartRates=sum_Of_HeartRates+bpm_Values; 

    } 
    avg_heartBeats=sum_Of_HeartRates/(int)sampleObjects.count; 
}]; 

[heartQuery setUpdateHandler:^(HKAnchoredObjectQuery *query, NSArray<HKSample *> *SampleArray, NSArray<HKDeletedObject *> *deletedObjects, HKQueryAnchor *Anchor, NSError *error) { 

    HKQuantitySample *sample = (HKQuantitySample *)[SampleArray objectAtIndex:0]; 
    HKQuantity *quantity = sample.quantity; 
    new_Updated_Data =[quantity doubleValueForUnit:[HKUnit unitFromString:@"count/min"]]; 
    NSLog(@"new quantity:%f",new_Updated_Data); 
}]; 

[self.healthStore executeQuery:heartQuery]; 
NSLog(@"updated data %f",new_Updated_Data); 


NSLog(@"%f", avg_heartBeats); 

} 
+1

Как насчет observerquery? – Ujjwal

+1

В чем проблема в HKAnchoredQuery? В HKObserverQuery я не получаю, где хранить данные, поскольку у меня есть NSArray в HKAnchoredQuery. Мне было немного легко хранить данные в массиве. –

+0

с запросом наблюдателя вы можете получать обновления автоматически, когда есть изменение в данных о здоровье по вашему вопросу. и, соответственно, вы можете получить данные. это поможет вам? – Ujjwal

ответ

0

Смотрите, если следующий код может помочь вам ...

HKSampleType *sampleType = 
    [HKObjectType quantityTypeForIdentifier:HKQuantityTypeIdentifierHeartRate]; 

    HKObserverQuery *query = 
    [[HKObserverQuery alloc] 
    initWithSampleType:sampleType 
    predicate:nil 
    updateHandler:^(HKObserverQuery *query, 
        HKObserverQueryCompletionHandler completionHandler, 
        NSError *error) { 

     if (error) { 


      NSLog(@"error occured while setting observer. %@ ", 
        error.localizedDescription); 
      abort(); 
     } 

     // Take whatever steps are necessary to update your app's data and UI 
     // This may involve executing other queries 


[self executeAnchoredQuery]; 

     // If you have subscribed for background updates you must call the completion handler here. 
     // completionHandler(); 

    }]; 

    [self.healthStore executeQuery:query]; 

, а затем функция, где вы пишете вы anchoredQuery код, это может дать вам представление о коде поток:

-(void)executeAnchoredQuery 
{ 
HKSampleType *sampleType = 
[HKObjectType quantityTypeForIdentifier:HKQuantityTypeIdentifierStepCount]; 

HKAnchoredObjectQuery *query = 
[[HKAnchoredObjectQuery alloc] 
initWithType:sampleType 
predicate:nil 
anchor:self.anchor 
limit:HKObjectQueryNoLimit 
resultsHandler:^(HKAnchoredObjectQuery * _Nonnull query, 
        NSArray<__kindof HKSample *> * _Nullable sampleObjects, 
        NSArray<HKDeletedObject *> * _Nullable deletedObjects, 
        HKQueryAnchor * _Nullable newAnchor, 
        NSError * _Nullable error) { 

    if (error != nil) { 
     // Add proper error handling here... 
     NSLog(@"*** Unable to query for step counts: %@ ***", 
       error.localizedDescription); 
     abort(); 
    } 

    // Process the results... 
    self.anchor = newAnchor; 

    for (HKQuantitySample *sample in sampleObjects) { 
     [self addStepCountSample:sample]; 
    } 

    for (HKDeletedObject *sample in deletedObjects) { 
     [self removeStepCountSample:sample]; 
    } 

    NSLog(@"Done!"); 
}]; 

[self.healthStore executeQuery:query]; 

} 

Просьба ознакомиться с документами разработчиков Apple для получения более подробной информации.

+0

Да, но мы получаем и сохраняем запрошенные данные, нет NSArray или Словаря? –

+0

никакой запрос наблюдателя не уведомит вас об изменениях, и, как вы можете видеть в комментариях в коде, вы можете выполнить другие запросы для извлечения данных. см. комментарий '// Это может быть связано с выполнением других запросов' – Ujjwal

+0

cool, я пробую спасибо :) –

Смежные вопросы