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
@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. –
@TusharSharma var healthManager: HealthManager? –
@TusharSharma J'ai ajouté un lien pour télécharger mon fichier de projet Xcode. –