2017-12-19 4 views
0

abrufen Wie der Titel sagt habe ich ein seltsames Problem, um einfache Daten von Firebase abrufen, aber ich kann wirklich nicht herausfinden, wo ich falsch liegen würde.Kann nicht Daten von Firebase mit Swift

Das ist mein Schema:

enter image description here

Und der Code:

import Firebase 

let DB_BASE = Database.database().reference() 

class FirebaseService { 

    static let instance = FirebaseService() 

    private var REF_BASE = DB_BASE 
    private var REF_SERVICE_STATUS = DB_BASE.child("Service_Status") 

    struct ServiceStatus { 
     var downloadStatus: Bool 
     var uploadStatus: Bool 
    } 

    func getServiceStatus() -> (ServiceStatus?) { 
     var serviceStatus: ServiceStatus? 

     REF_SERVICE_STATUS.observeSingleEvent(of: .value) { (requestSnapshot) in 

      if let unwrapped = requestSnapshot.children.allObjects as? [DataSnapshot] { 
       for status in unwrapped { 
        serviceStatus.downloadStatus = status.childSnapshot(forPath: "Download_Status").value as! Bool 
        serviceStatus.uploadStatus = status.childSnapshot(forPath: "Upload_Status").value as! Bool 
       } 
       // THANKS TO JAY FOR CORRECTION 
       return sponsorStatus 
      } 
     } 
    } 
} 

aber am Ende serviceStatus ist gleich Null. Irgendein Rat?

+0

Der * Return * nicht richtig verwendet wird. In diesem Fall wird die Rückmeldung ausgeführt, bevor der Code in der Firebase-Funktion Daten vom Server zurückgibt. Firebase ist asynchron und Sie müssen daher als solche codieren. Siehe [Aktion nach Download] (https://stackoverflow.com/questions/43027817/how-to-perform-an-action-only-after-data-are-downloaded-from-firebase/43029121#43029121) und [Firebase async Aufgabe] (https://stackoverflow.com/questions/38550634/swift-firebase-return-in-asynchron-task/38551937#38551937) – Jay

+0

@Jay Danke, das habe ich korrigiert, aber das Problem ist, dass serviveStatus eigentlich Null ist ! Mache ich etwas falsch, um Daten abzurufen? – user3582537

Antwort

0

Ich denke, Sie können Ihren Code ein wenig vereinfachen, um es leichter zu verwalten. Versuchen Sie diese

let ssRef = DB_BASE.child("Service_Status") 
ssRef.observeSingleEvent(of: .value) { snapshot in 
    let dict = snapshot.value as! [String: Any] 
    let down = dict["Download_Status"] ?? false 
    let up = dict["Upload_Status"] ?? false 
} 

die ?? gibt den Down- und Up-Vars einen Standardwert von false, wenn die Knoten Null sind (dh nicht existieren)

Oh - und versuchen, Daten von einem asynchronen Firebase-Aufruf (Schließung) zurückzugeben, wird nicht wirklich funktionieren (wie es ist).

Denken Sie daran, dass normale Funktionen synchron durch den Code laufen und dann einen Wert an die aufrufende Funktion zurückgeben und diese aufrufende Funktion dann zur nächsten Codezeile weitergeht.

Sobald Sie Ihre Firebase-Funktion aufrufen, geht Ihr Code glücklich in die nächste Zeile vor Firebase hat eine Chance, die Daten vom Server zu erhalten und die Rückkehr var. Mit anderen Worten - tu es nicht.

Es gibt immer Alternativen, so überprüfen Sie diesen Link aus

Run code only after asynchronous function finishes executing