2016-03-29 8 views
0

Ich habe einen Code geschrieben, um die Herzfrequenzwerte aus dem Health-Kit zu erhalten. Der Code funktioniert gut, aber wenn die neuen Herzwerte im Health-Kit aktualisiert werden. Ich muss zum Hauptbildschirm kommen und dann meine App multitasking, um die aktualisierten Ergebnisse zu erhalten. Was mein Ziel ist, das aktualisierte Ergebnis meiner App zu erhalten, ohne sie erneut zu öffnen oder zu multitasken, bitte helfen Sie mir, da ich neu in der iOS-Entwicklung bin. Mein Code: -HKAnchoredQuery Update-Handler funktioniert nicht richtig

-(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

Was ist mit der Observerquery? – Ujjwal

+1

Was ist das Problem in HKAnchoredQuery? In HKObserverQuery bekomme ich nicht, wo ich Daten speichern soll, da ich NSArray in HKAnchoredQuery finde Ich fand es ein wenig einfach, Daten in einem Array zu speichern. –

+0

mit Observer-Abfrage können Sie die Updates automatisch erhalten, wenn es eine Änderung in den Gesundheitsdaten nach Ihrer Frage gibt. und dementsprechend können Sie die Daten abrufen. Wird es dir helfen? – Ujjwal

Antwort

0

Prüfen Sie, ob der folgende Code könnte Ihnen helfen ...

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]; 

und dann die Funktion, wo man Sie anchoredQuery Code zu schreiben, kann dies Ihnen eine Vorstellung von dem Code geben Fluss:

-(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]; 

} 

Bitte gehen Sie durch Apple Entwickler Dokumente für weitere Details.

+0

Ja, aber erhalten und speichern wir die abgefragten Daten, gibt es kein NSArray oder Dictionary? –

+0

keine Beobachterabfrage wird Sie über die Änderungen informieren, und wie Sie in den kommentierten Zeilen im Code sehen können, können Sie andere Abfragen ausführen, um die Daten abzurufen. Siehe den Kommentar '// Dies kann beinhalten Ausführen anderer Abfragen' – Ujjwal

+0

cool, ich versuche, danke :) –