2017-03-19 3 views
2

Ich habe eine Referenz, die existiert und ich verwende observeEventType, um die Daten abzufragen. Die Referenz enthält jedoch möglicherweise keine Daten, da der Benutzer sie löscht. Ich teste es mit snapshot.exists(). In der Situation unter snapshot.exists() wird false/no zurückgegeben. Da es falsch ist möchte ich etwas anderes tun, aber der Code läuft nieWas tun, wenn snapshot.exists() false zurückgibt?

Wie mache ich so etwas anderes, wenn snapshot.exists() false/no zurückgibt?

 //there is no data at levelTwo so there's nothing to observe 
let levelTwoRef = dbRef.child("players").child("uid").child("levelTwo") 

levelTwoRef.observeEventType(.ChildAdded, withBlock: { 
     (snapshot) in 
     if snapshot.exists(){ 
      if let dict = snapshot.value as? [String:AnyObject]{ 
       let power = dict["power"] as? String 
       let score = dict["score"] as? String 
      } 
     //this will never run because the data has been deleted 
     } else{ 
      do something else as an alternative //why isn't this running?? 
     } 
    }) 

enter image description here

+0

Aktualisieren Sie Ihre Frage mit Ihrer Datenbank JSON Struktur (aktuelle, als Text kein Bild!). – Dravidian

+0

Dies ist nicht Ihre JSON-Struktur. Sie erhalten Ihre JSON-Struktur, indem Sie in der Firebase-Datenbankkonsole auf EXPORT JSON klicken, sie auf die relevantesten Teile minimieren und dann veröffentlichen. – Dravidian

+0

@Dravidian Du hast mir etwas Neues beigebracht. Ich habe nie davon gewusst. Ich werde es in ein paar tun. Vielen Dank! –

Antwort

0

Firebase hat eine .hasChild Funktion, die Sie auf einem child ausführen können, um zu sehen, wenn es vorhanden ist:

func hasChild(_ childPathString: String) -> Bool 

Es hat eine child als String Argument verwendet und True oder False je nachdem, ob es existiert oder nicht.

Der Weg, um zu überprüfen, ob ein Kind existiert, besteht darin, zuerst einen Pfad zum Kind vor dem gesuchten Kind festzulegen. In der Situation, von der Frage, das Kind zu suchen ist "levelTwo" und das Kind, bevor das ist uid:

//there is no data at levelTwo so there's nothing to observe 
let levelTwoRef = dbRef.child("players").child("uid").child("levelTwo") 

Sie den uid ref wissen Unter der Annahme, existiert auf jeden Fall eine Konstante für die uid ref anstelle des levelTwo gesetzt ref

// uid path definitely exists 
let uidRef = dbRef.child("players").child("uid") 

Run .value auf dem uid ref und innerhalb des Callback-Check, um zu sehen, ob die levelTwo r ef existiert:

uidRef?.observeSingleEvent(of: .value, with: { 
       (snapshot) in 

       if snapshot.hasChild("levelTwo"){ 
        // true -levelTwo ref Does exist so do something 
       }else{ 
        // false -levelTwo ref DOESN'T exist so do something else 
       } 
} 
0

Sie führen, dass innerhalb observeEventType mit dem Typ .ChildAdded, die den Schnappschuss eines jeden neuen Pfad zurückkehren würde, die erstellt wird. Wenn Sie den Wert nur einmal abrufen müssen, verwenden Sie observeSingleEventOfType (link) mit .Value als Ereignistyp.

+0

danke. 2 Dinge. 1- Ich habe observateSingleEventOfType versucht und da dort nichts war, wurde meine else-Anweisung nicht ausgeführt. 2- Es gibt mehrere Pfade unter dem Knoten. .Value erstellt eine Momentaufnahme aller Objekte auf einmal vom Knoten. .ChildAdded macht mehrere Reisen, um alles unter den Knoten zu bekommen. Sie erhalten in beiden Fällen die gleichen Ergebnisse. Das ist nicht mein Problem. Mein Problem, was zu tun ist, wenn überhaupt nichts da ist. –

Verwandte Themen