2016-08-06 20 views
0

Ich versuche Childs von The Firebase-Datenbank mit diesem CodeEmpfangen von Daten Firebase swift mit

let rootRef = FIRDatabase.database().reference().child("UsersInfo").child((FIRAuth.auth()?.currentUser?.uid)!) 
rootRef.observeEventType(FIRDataEventType.Value, withBlock: { (snapshot) in 

    let hello = snapshot.value as! [String : AnyObject] 
    let usernamerecieved = hello["Username"] as! String 
    let Emailrecieved = hello["Email"] as! String 
    let bloodtyperecieved = hello["BloodType"] as! String 

    globalusername = usernamerecieved (EDITED) 

}) 

und ich habe eine globale Variable als solche

erklärt (die in viewdidload deklariert wird) abrufen
var globalusername = "user" 

Ich versuche, die usernamerecieved Variable zu extrahieren und es auf eine globale Variable zu werfen. Wenn ich jedoch später die globale Variable in viewdidLoad drucke, bekomme ich immer noch den Anfangswert von globalusername, der "Benutzer" ist.

+0

Veröffentlichen Sie die JSON-Struktur Ihrer Datenbank.Und prüfen Sie, ob Sie den 'username recieded' von der Datenbank erhalten, versuchen Sie es zu drucken. Und hat es nach der Bearbeitung funktioniert? – Dravidian

Antwort

0

In dieser Codezeile sehen: usernamerecieved = globalusername, was Sie in dieser Linie tun, ist, dass Sie den Wert des usernamerecieved auf den Wert von globalusername dh ‚Benutzer setzen ' Es sollte globalusername = usernamerecieved sein.

Manchmal braucht es auch Zeit, um Daten vom Server abzurufen. Gründe können zahlreich sein - langsame Netzwerkverbindung, schwere Datenabruf wie Bilder etc., aber bevor es abgeschlossen werden konnte (Abrufen der Aktion vom Server) ist das möglich Zeile, in der Sie die globalusername zuerst aufgerufen wird, noch bevor die completionBlock aus der observeEventType ist sogar abgeschlossen (seit seiner asynchronen, etwas ähnlich wie dispatch_async). Um das anzugehen, sollten Sie den Druckanruf für globalusername innerhalb der CompletionBlock aufrufen oder beobachten Ändern Sie den Wert, indem Sie addObserver zu globalusername verwenden, die Sie wissen lassen, wann immer der Wert von globalusername geändert oder aktualisiert wird, damit Sie entsprechend handeln können.

0

Der Block von observeEventType ist asynchron. Wenn Sie den globalen Benutzernamen var lesen, ist der Block möglicherweise noch nicht vollständig.

Drucken Sie globalusername innerhalb des Blocks und den Wert