Bagaimana cara menggunakan Nil dalam aliran kontrol dengan snapshot Firebase? (Cepat) [duplikat]

Saya mencoba memeriksa untuk melihat apakah kunci/nilai (TestKey/TestValue) ada di sebuah node dan apakah itu melakukan A dan jika tidak melakukan B.

Saya telah menemukan utas serupa mengenai hal ini di StackOverflow tetapi sepertinya tidak ada solusi yang berhasil untuk saya: Memeriksa apakah snapshot Firebase sama dengan nil di Swift

Saya memiliki pengaturan database yang sudah memasukkan pasangan kunci TestKey/TestValue. Ini kode saya:

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

Soalnya hanya "A" yang dieksekusi, padahal dari tes print hasilnya nihil.

Saya telah mencoba membalikkan operasi dengan == nil dan juga mencoba "is NSNull".

Sepertinya saya tidak bisa membuat aliran kontrol berfungsi dengan baik. Mungkin salah satu dari berikut ini adalah pelakunya tetapi saya tidak yakin:

  1. interaksi ketekunan dengan observasiSingleEventOfType
  2. tidak menghapus pengamat (apakah saya perlu melakukannya untuk observasiSingleEventType?)
  3. ada hubungannya dengan opsional
  4. ada hubungannya dengan panggilan asinkron
  5. ada hubungannya dengan fakta bahwa firebase menyimpan NSAnyObjects

Pada akhirnya tujuannya adalah untuk memeriksa apakah pasangan kunci/nilai ada dan jika memang ada: jangan lakukan apa pun kecuali jika tidak ada: buatlah. Apa yang saya lakukan salah dan bagaimana cara agar aliran kontrol ini berfungsi?


person Abhi    schedule 04.08.2016    source sumber


Jawaban (1)


Ok jadi setelah banyak mengutak-atik saya menemukan solusi yang berhasil, itu memang diposting sebagai jawaban ini (https://stackoverflow.com/a/35682760/6515861) dari pertanyaan sebelumnya yang saya tautkan (Memeriksa apakah snapshot Firebase sama dengan nihil di Swift).

Cara membuatnya berfungsi adalah dengan memasukkan TestKey ke dalam referensi itu sendiri, menghapus referensi dari snapshot.value("TestKey"), lalu menggunakan "is Null".

Ini kode kerjanya:

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

Saya senang saya menemukan solusi ini tetapi jika ada yang masih ingin menjawab pertanyaan awal, saya ingin tahu mengapa cara lain tidak berhasil.

person Abhi    schedule 04.08.2016