2017-10-21 57 views
0

J'ai des problèmes dans une requête de swift à firebase. ci-dessous est mon exemple JSON dans firebase:Ajout de données et interrogation de swift à firebase

Lulibvi-D220

Contas 

    -KwlPQZTqVfNhHAsFyW5 
     Nome: "Assets" 
     Numero: "1" 

    -KwlGJLUTqVfnhYHAsFyW5 
     Nome: "Liabilities" 
     Numero: "2" 

mon code est le suivant:

let nome: String = "Liabilities" 
    let numero: String = "2" 
    ref = Database.database().reference() 
    ref.child("Contas").child("Assets").observeSingleEvent(of: .value) { (snapshot) in 
     let numero = (snapshot.value as? NSDictionary)?["Numero"] as? String 
     print (numero as Any) 
} 

lorsque le débogage, le débogueur saute juste tout le code après (instantané) en et ne l'exécute pas.

Qu'est-ce que je fais mal?

grâce

Répondre

1

tl; dr: Pour déboguer votre code asynchrone dans XCode, placez un point d'arrêt sur la première instruction dans le gestionnaire d'achèvement.

explication plus longue:

Lorsque vous observez une valeur de Firebase, il peut prendre une quantité de temps pour obtenir ces données. Pour éviter que votre programme ne soit bloqué pendant ce temps, les données sont chargées depuis la base de données Firebase en arrière-plan pendant que votre code continue. Ensuite, lorsque les données deviennent disponibles, Firebase appelle votre gestionnaire d'achèvement.

Ce modèle est connu sous le nom de chargement asynchrone et est commun à pratiquement toutes les API Web modernes. Mais il peut être incroyablement difficile de s'y habituer.

Une façon facile de voir ce qui se passe est d'exécuter le code avec quelques déclarations de journalisation bien lieu:

ref = Database.database().reference() 
print("Before attaching observer") 
ref.child("Contas").child("Assets").observeSingleEvent(of: .value) { (snapshot) in 
    print("Inside completion handler") 
} 
print("After attaching observer") 

Ce code immédiatement imprimé:

Avant de fixer observateur

Après avoir attiré l'observateur

Et puis après quelques instants (en fonction de la vitesse du réseau et d'autres facteurs):

intérieur gestionnaire d'achèvement

Bien qu'il existe des façons de rendre le code après le bloc d'attente pour les données (voir la liens ci-dessous pour plus sur cela), la façon la plus courante de traiter le chargement asynchrone est de recadrer la question. Au lieu d'essayer de coder "d'abord obtenir les données, puis imprimez-le", encadrer votre problème comme "nous commençons à obtenir les données, chaque fois que nous obtenons les données, nous l'imprimons".

La façon de modéliser ceci en code est que vous déplacez tout le code qui a besoin d'accéder aux données de Firebase dans le gestionnaire de complétion de votre observateur. Votre code le fait déjà en ayant print (numero as Any) dedans.

Pour déboguer votre code asynchrone dans XCode, placez un point d'arrêt sur le code dans le gestionnaire d'achèvement. Ce point d'arrêt sera alors atteint lorsque les données reviendront de Firebase.

Quelques questions qui traitent aussi avec ce comportement:

+0

Grande ... Il travaillé!!! merci beaucoup pour l'explication complète –