Как использовать Nil в потоке управления со снимками Firebase? (Свифт)

Я пытаюсь проверить, существует ли ключ/значение (TestKey/TestValue) в узле, и если он делает A и если он не делает B.

Я нашел аналогичную тему в StackOverflow, но ни одно из решений, похоже, не сработало для меня: to-nil-in-swift">Проверка того, равен ли моментальный снимок Firebase нулю в 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)
    }

Проблема в том, что выполняется только «А», даже если тест печати показывает, что результат нулевой.

Я пытался отменить операции с == nil, а также пробовал «is NSNull».

Кажется, я не могу заставить поток управления работать должным образом. Возможно, что-то из следующего является виновником, но я не уверен:

  1. взаимодействие постоянства сObservsSingleEventOfType
  2. не удаляя наблюдателя (мне даже нужно дляObservSingleEventType?)
  3. что-то с опционами
  4. что-то делать с асинхронными вызовами
  5. что-то связанное с тем, что firebase хранит NSAnyObjects

В конечном итоге цель состоит в том, чтобы проверить, существует ли пара ключ/значение, и если она существует, то ничего не делать, а если она не существует, то создать ее. Что я делаю неправильно и как заставить этот поток управления работать?


person Abhi    schedule 04.08.2016    source источник


Ответы (1)


Итак, после долгих возни я нашел решение, которое работает, оно действительно было опубликовано как этот ответ (https://stackoverflow.com/a/35682760/6515861) из ранее существовавшего вопроса, который я связал (Проверка того, равен ли моментальный снимок Firebase нулю в 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