2017-05-12 1 views
0

J'essaie de récupérer de manière synchrone une information d'objet PFUser. Cependant, j'ai essayé d'utiliser fetch, mais je continue à obtenir des erreurs de mise en œuvre. Je voudrais trouver par exemple: PFUser.currentUser()?. ObjectForKey ("scoreNumber"), mais je ne reçois pas la valeur mise à jour. On m'a dit que je le trouverais en utilisant fetch, mais je suis incapable d'implémenter objectForKey dans ma fonction de récupération.Comment faire pour récupérer de manière synchrone PFUser objectForKey dans Swift

Certaines des tentatives

var score: String! 
func retrieveScore(){ 
    guard let myUser = PFUser.currentUser() else { return } 
     do{ let data = try myUser.objectForKey("scoreNumber")?.fetch() 
     try scoreNumber = data! as! String 
    }catch{} 
} 

Un autre

let userScore = PFUser.currentUser()?.objectForKey("scoreNumber") 
let userScore2 = userScore.fetch() 
+0

Êtes-vous sûr que vous avez un utilisateur qui est connecté? –

+0

@ZonilyJame Oui, je sauvegarde l'utilisateur avec NSUserDefaults. – Dups

Répondre

1

Vous ne devriez pas enregistrer l'utilisateur pour NSUserDefaults. Parse SDK fait un bon travail de gestion de vos sessions pour vous. Juste avoir un bouton de déconnexion spécifique qui appelle la fonction [déconnexion PFUser] `. Donc, fetch est une opération asynchrone. Cela signifie qu'il s'exécute sur un thread distinct, puis le thread principal continuera à exécuter les commandes suivantes. Ainsi, vous appelez fetch, qui récupère un objet en arrière-plan, mais vous tentez d'accéder à une valeur de l'objet qui n'a pas encore été récupéré. Vous devez accéder à l'objet depuis le bloc qui gère les résultats de l'appel de récupération. Lorsque vous appelez chercher comme vous l'avez fait, juste avec .fetch(), il s'exécute en arrière-plan, mais ne vous alerte pas lorsque vous avez les données, ni si la récupération échoue. Ce n'est pas un bon moyen d'obtenir immédiatement les données dont vous aurez besoin.

Vous devez utiliser fetchInBackgroundWithBlock()

scoreNumber.fetchInBackgroundWithBlock() { 
    (scoreNumber: PFObject?, error: NSError?) -> Void in 
    if error == nil && scoreNumber != nil { 
    print(scoreNumber) 
    } else { 
    print(error) 
    } 
}