2017-03-06 1 views
0

J'essaie le HKTutorial que j'ai téléchargé de Ray Wenderlich (https://www.raywenderlich.com/89733/healthkit-tutorial-with-swift-workouts) et converti la source à Swift 3.0readRunningWorkOuts fonction avec l'achèvement en classe HKManager (HKTutorial) ne sont jamais exécutées à Swift 3

Je suis perplexe par le comportement des codes dans viewWillAppear de WorkoutsTableViewController.

Ma version de viewWillAppear après la conversion:

open override func viewWillAppear(_ animated: Bool) { 
    super.viewWillAppear(animated) 

    print("View will appear") 
    healthManager?.readRunningWorkOuts({ (results, error) -> Void in 
     if(error != nil) 
     { 
      print("Error reading workouts: \(error?.localizedDescription)") 
      return; 
     } 
     else 
     { 
      print("Workouts read successfully!") 
     } 
     print("Really") 
     //Kkeep workouts and refresh tableview in main thread 
     self.workouts = results as! [HKWorkout] 
     DispatchQueue.main.async(execute: {() -> Void in 
      self.tableView.reloadData() 
     }); 

     }) 
     print("viewWillAppear ends") 
    } 

    open override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 
    print(workouts.count) 
    return workouts.count 
    } 

et fonc readRunningWorkouts en classe HKManager:

func readRunningWorkOuts(_ completion: (([AnyObject]?, NSError?) -> Void)!) { 

    print("readRunningWorkOuts") 
    // 1. Predicate to read only running workouts 
    let predicate = HKQuery.predicateForWorkouts(with: HKWorkoutActivityType.running) 
    // 2. Order the workouts by date 
    let sortDescriptor = NSSortDescriptor(key:HKSampleSortIdentifierStartDate, ascending: false) 
    // 3. Create the query 
    let sampleQuery = HKSampleQuery(sampleType: HKWorkoutType.workoutType(), predicate: predicate, limit: 0, sortDescriptors: [sortDescriptor]) 
    { (sampleQuery, results, error) -> Void in 

     if let queryError = error { 
      print("There was an error while reading the samples: \(queryError.localizedDescription)") 
     } 
     completion!(results,error as NSError?) 
    } 
    // 4. Execute the query 
    healthKitStore.execute(sampleQuery) 

} 

et la sortie montre:

View will appear 
viewWillAppear ends 
0 
0 
0 
0 
0 

La valeur de workouts.count dans func numberOfRows indique qu'aucun enregistrement n'a été lu.

L'autorisation est faite et j'ai beaucoup de données en cours d'exécution dans l'application de santé.

De toute évidence, les instructions entre print ("View apparaîtra") et print ("viewWillAppear ends") ne sont jamais exécutées.

Qu'est-ce que j'ai manqué? Le code est-il correct? S'il vous plaît éclairer. Je vous remercie.

Les fichiers de projet peuvent être téléchargés à https://dl.dropboxusercontent.com/u/2400869/HKTutorialFinalCode.zip

+0

@TusharSharma J'ai fait. La fonction n'est jamais appelée. Il aurait exécuté la première instruction print si elle était appelée. –

+0

@TusharSharma var healthManager: HealthManager? –

+0

@TusharSharma J'ai ajouté un lien pour télécharger mon fichier de projet Xcode. –

Répondre

0

je résolu le problème en changeant la ligne 22 de WorkoutsTableViewController.swift à:

var healthManager:HealthManager = HealthManager() 

Et changé la ligne Func viewWillAppear:

healthManager?.readRunningWorkOut({ (results, error) -> Void in 

à:

healthManager.readRunningWorkOut({ (results, error) -> Void in 

Maintenant, cela fonctionne.