จะใช้ Nil ในโฟลว์ควบคุมด้วยสแน็ปช็อต Firebase ได้อย่างไร (สวิฟท์) [ซ้ำกัน]

ฉันกำลังพยายามตรวจสอบเพื่อดูว่ามีคีย์/ค่า (TestKey/TestValue) อยู่ที่โหนดหรือไม่ และโหนดนั้นทำ A หรือไม่ และมันไม่ทำ B หรือไม่

ฉันพบกระทู้ที่คล้ายกันเกี่ยวกับเรื่องนี้ใน StackOverflow แต่ดูเหมือนจะไม่มีวิธีแก้ไขปัญหาใดที่เหมาะกับฉัน: ตรวจสอบว่า Firebase snapshot เท่ากับศูนย์ใน Swift หรือไม่

ฉันมีการตั้งค่าฐานข้อมูลที่มีการใส่คู่คีย์ TestKey/TestValue ไว้แล้ว นี่คือรหัสของฉัน:

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)
    }

ปัญหาคือมีเพียง "A" เท่านั้นที่ถูกดำเนินการ แม้ว่าการทดสอบการพิมพ์จะแสดงผลลัพธ์เป็นศูนย์ก็ตาม

ฉันได้ลองย้อนกลับการดำเนินการด้วย == nil และได้ลอง "is NSNUll" แล้ว

ดูเหมือนว่าฉันไม่สามารถทำให้โฟลว์การควบคุมทำงานได้อย่างถูกต้อง บางทีหนึ่งในสิ่งต่อไปนี้อาจเป็นตัวการ แต่ฉันไม่แน่ใจ:

  1. ปฏิสัมพันธ์ของการคงอยู่กับการสังเกต SingleEventOfType
  2. ไม่ลบผู้สังเกตการณ์ (ฉันจำเป็นต้องทำ observSingleEventType ด้วยหรือไม่)
  3. บางอย่างที่เกี่ยวข้องกับตัวเลือก
  4. บางอย่างเกี่ยวกับการโทรแบบอะซิงโครนัส
  5. บางอย่างเกี่ยวข้องกับความจริงที่ว่า firebase เก็บ NSAnyObjects

เป้าหมายสูงสุดคือการตรวจสอบว่ามีคู่คีย์/ค่าอยู่หรือไม่ และมีอยู่หรือไม่ ไม่ต้องทำอะไรเลย หากไม่มี ให้สร้างมันขึ้นมา ฉันทำอะไรผิดและฉันจะทำให้โฟลว์การควบคุมนี้ทำงานได้อย่างไร


person Abhi    schedule 04.08.2016    source แหล่งที่มา


คำตอบ (1)


ตกลงหลังจากเล่นซอไปมากฉันก็พบวิธีแก้ปัญหาที่ใช้งานได้จริง ๆ แล้วมันถูกโพสต์เป็นคำตอบนี้ (https://stackoverflow.com/a/35682760/6515861) จากคำถามที่มีอยู่ก่อนหน้านี้ที่ฉันเชื่อมโยง (กำลังตรวจสอบว่า Firebase snapshot เท่ากับศูนย์ใน Swift หรือไม่)

วิธีทำให้มันใช้งานได้คือการป้อน TestKey ในการอ้างอิงนั้น ลบการอ้างอิงออกจาก snapshot.value("TestKey") แล้วใช้ "is Null"

นี่คือรหัสการทำงาน:

// 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)
    }

ฉันดีใจที่พบวิธีแก้ปัญหานี้ แต่ถ้าใครยังต้องการตอบคำถามเดิม ฉันอยากจะรู้ว่าเหตุใดจึงไม่ได้ผลด้วยวิธีอื่น

person Abhi    schedule 04.08.2016