2017-10-10 12 views
0

Donc, selon Apple, je dois appeler le HKObserverQueryCompletionHandler après que le updateHandler soit déclenché à partir des données ajoutées à HK.La livraison de l'arrière-plan HKObserverQuery cesse de fonctionner après l'appel de completionHandler

Mais dès que je l'appelle completionHandler, la requête d'observateur cesse de donner plus de mises à jour en arrière-plan ..

Voici mon code:

guard let sampleType = sample as? HKQuantityType else { return nil } 

let query = HKObserverQuery(sampleType: sampleType, predicate: nil, updateHandler: { query, completionHandler, error in 

    completionHandler() 

    IamExecutingHKStatisticsCollectionQueryHere() 
}) 

healthStore?.execute(query) 
healthStore?.enableBackgroundDelivery(for: sampleType, frequency: .hourly, withCompletion: { success, error in 

}) 

Si je ne l'appelle pas la completionHandler , tout fonctionne bien, mais je n'ai jamais testé pendant de longues périodes de temps ..

Répondre

0

L'appel completionHandler() indique que vous avez terminé le traitement de nouvelles données. Ne l'appelez qu'une fois que vous avez traité les résultats des requêtes exécutées en réponse à updateHandler appelé. Si vous appelez le completionHandler() dès maintenant, le système arrêtera d'exécuter votre application en arrière-plan avant que vous ne puissiez traiter les données.

+0

J'ai déjà essayé cela .. n'a rien changé. Le problème est que si j'appelle le completionHandler(), je ne reçois aucune autre mise à jour. Est-ce que l'appel de completionHandler signifie que je veux arrêter de recevoir des mises à jour? –

+0

Quels types d'échantillons observez-vous de cette façon? Votre code s'inscrire pour les mises à jour horaires. Êtes-vous en train de dire que votre application ne se lance pas une fois par heure lorsqu'il y a de nouvelles données? Attendez-vous qu'il soit notifié immédiatement? – Allan

+0

le type de données est étapes. Je m'attends à être averti toutes les heures quand de nouvelles étapes sont ajoutées à HK mais je ne le suis pas. Bien que si je n'appelle jamais le completionHandler, tout fonctionne parfaitement .. Je suppose que c'est un bug ?! –