2017-10-12 7 views
0

Bonjour Je veux saisir le dernier point de données pour la masse corporelle de chaque jour dans un intervalle de temps défini (dans mon cas j'ai besoin pour un intervalle d'une semaine, mais seulement la dernière entrée pour chaque jour.)Comment puis-je récupérer la dernière entrée de poids à partir des données de HealthKit pour chaque jour dans un intervalle de temps défini

en fait, en utilisant ce code que je peux obtenir toutes les entrées de la date de début de X à la date de fin de X

let query = HKSampleQuery(sampleType: type!, predicate: predicate, 
             limit: 0, sortDescriptors: nil, resultsHandler: { (query, results, error) in 
             if let myResults = results { 
              for result in myResults { 
               let bodymass = result as! HKQuantitySample 
               let weight = bodymass.quantity.doubleValue(for: unit) 
               Print ("this is my weight value",weight ) 
              } 
             } 
             else { 
              print("There was an error running the query: \(String(describing: error))") 
             } 

Cette requête renvoie tous les échantillons mesurant le poids consommé qui tombent dans le délai. Je veux juste retourner la dernière entrée enregistrée est-il possible de le faire avec une requête Heath-Kit?

J'ai essayé de définir le descripteur de tri mais je ne trouve pas un moyen de le faire fonctionner avec un intervalle de temps défini.

Merci

I read this et this one

Répondre

1

Comme vous avez dit que vous souhaitez utiliser un descripteur de tri, il suffit d'utiliser Date.distantPast et Date() que votre gamme, puis il suffit de prendre la première:

func getUserBodyMass(completion: @escaping (HKQuantitySample) -> Void) { 

      guard let weightSampleType = HKSampleType.quantityType(forIdentifier: .bodyMass) else { 
       print("Body Mass Sample Type is no longer available in HealthKit") 
       return 
      } 

      //1. Use HKQuery to load the most recent samples. 
      let mostRecentPredicate = HKQuery.predicateForSamples(withStart: Date.distantPast, 
                    end: Date(), 
                    options: []) 
      let sortDescriptor = NSSortDescriptor(key: HKSampleSortIdentifierStartDate, 
                ascending: false) 
      let limit = 1 
      let sampleQuery = HKSampleQuery(sampleType: weightSampleType, 
              predicate: mostRecentPredicate, 
              limit: limit, 
              sortDescriptors: [sortDescriptor]) { (query, samples, error) in 


               //2. Always dispatch to the main thread when complete. 
               DispatchQueue.main.async { 
                guard let samples = samples, 
                 let mostRecentSample = samples.first as? HKQuantitySample else { 
                  print("getUserBodyMass sample is missing") 
                  return 
                } 
                completion(mostRecentSample) 
               } 
      } 
      healthStore.execute(sampleQuery) 
    }