2016-08-04 10 views
2

Ich versuche, um zu prüfen, ob ein Schlüssel/Wert (TestKey/Testvalue) an einem Knoten vorhanden ist, und wenn es A tut und wenn es nicht B. machtWie verwendet man Nil im Kontrollfluss mit Firebase-Snapshots? (Swift)

Ich habe diesen ähnlichen Thread gefunden in Bezug auf StackOverflow, aber keine der Lösungen schien für mich zu arbeiten: Checking if Firebase snapshot is equal to nil in Swift

Ich habe eine Datenbank eingerichtet, die bereits das Schlüsselpaar TestKey/TestValue eingefügt hat. Hier ist mein Code:

var ref: FIRDatabaseReference! 
    ref = FIRDatabase.database().reference() 

    ref.observeSingleEventOfType(.Value, withBlock: { (snapshot) in 

     //A print test to see stored value before control flow 
     print(snapshot.value!["TestKey"]) //returns TestValue 
     print(snapshot.value!["NilKey"]) //returns nil 

     // I change the value from TestKey <-> NilKey here to test the control flow 
     if snapshot.value!["TestKey"] != nil { 
      print("Exists currently") 
     } else { 
      print("Does not exist currently") 
     } 

    }) { (error) in 
     print(error.localizedDescription) 
    } 

Das Problem ist, dass nur „A“ ausgeführt wird, selbst wenn der Drucktest zeigt, dass das Ergebnis gleich Null ist.

Ich habe versucht, die Operationen mit == Nil umzukehren und habe auch versucht "is NSNull".

Ich kann nicht scheinen, um den Kontrollfluss richtig zu funktionieren. Vielleicht eine der folgenden ist der Schuldige, aber ich bin nicht sicher:

  1. Interaktion von Persistenz mit observesSingleEventOfType
  2. nicht den Beobachter zu entfernen (muss ich auch für observeSingleEventType?)
  3. etwas mit optionals zu tun
  4. etwas mit asynchronen Aufrufen
  5. etwas zu tun mit der Tatsache zu tun, dass Feuerbasis speichert NSAnyObjects

Letztlich ist es das Ziel zu überprüfen, ob ein Schlüssel/Wert-Paar existiert und falls es existiert: tue nichts, aber wenn es nicht existiert: Erstelle es. Was mache ich falsch und wie kann ich diesen Kontrollfluss zum Laufen bringen?

Antwort

3

Ok, nach viel Tüftelei fand ich eine Lösung, die funktioniert, wurde es tatsächlich als diese Antwort (https://stackoverflow.com/a/35682760/6515861) aus der früheren bestehenden Frage, die ich verlinkt (Checking if Firebase snapshot is equal to nil in Swift) geschrieben.

Der Weg, es zu arbeiten ist, den TestKey in der Referenz selbst einzugeben, entfernen Sie den Verweis von snapshot.value ("TestKey"), und verwenden Sie dann "ist Null".

Hier ist der Arbeitscode:

// Database already exists with "TestKey"/"TestValue" 

var ref: FIRDatabaseReference! 
ref = FIRDatabase.database().reference() 

    // replace "TestKey" with another string to test for nil 
    ref.child("TestKey").observeSingleEventOfType(.Value, withBlock: { (snapshot) in 

    if snapshot.value is NSNull { 
     print("Does not exist currently") 
    } else { 
     print("Exists currently") 
    } 


    }) { (error) in 
     print(error.localizedDescription) 
    } 

Ich bin froh, dass ich diese Lösung gefunden, aber wenn jemand noch will, um die ursprüngliche Frage beantworten, ich würde gerne wissen, warum sie nicht die andere Weise funktionieren.

Verwandte Themen