Сбой Snapshot.value на setValueForKeys - PullRequest
0 голосов
/ 28 апреля 2018
func observeMessages(){
  let ref = Database.database().reference().child("messages")
  ref.observe(.childAdded, with: { (snapshot) in
      if let dictionary = snapshot.value as? [String: AnyObject]{
          let message = Message()
          print(dictionary)
          message.setValuesForKeys(dictionary)
          self.messages.append(message)
          DispatchQueue.main.async { self.tableView.reloadData() }
      }
  }, withCancel: nil)
}

Это часть моего проекта Firebase & swift. Я продолжаю падать каждый раз, когда пытаюсь вызвать message.setValuesForKeys (словарь).

Сообщение об ошибке из консоли:

Завершение работы приложения из-за необработанного исключения «NSUnknownKeyException», причина: «[setValue: forUndefinedKey:]: этот класс не совместим с кодированием значения ключа для ключа toId

Я проверил словарь, и в нем есть данные, которые я хочу. Я не знаю, что еще я могу проверить. Я попытался изменить «snapshot.value» на «snapshot.children.allobjects», но с этим изменением я не могу получить доступ к данным внутри своего словаря.

1 Ответ

0 голосов
/ 29 апреля 2018

Мое первое предположение: у одного из ваших узлов Firebase есть ключ, которого нет в вашем классе

Завершение работы приложения из-за необработанного исключения «NSUnknownKeyException», причина: «[setValue: forUndefinedKey:]: этот класс не совместим с кодированием значения ключа для ключа toId

                                                                      ^^^^

Это хорошая подсказка.

Проверьте все узлы в вашей базе данных и убедитесь, что у них всех есть ключ toId и что у вашего класса также есть свойство toId.

Несоответствие клавиш приведет к этой проблеме.

Кроме того, если вы хотите использовать setObjectForValue, объект Message должен наследоваться от NSObject (который совместим с кодированием значения ключа)

Объекты обычно принимают кодирование значения ключа, когда они наследуются от NSObject (прямо или косвенно), который принимает Протокол NSKeyValueCoding и обеспечивает реализацию по умолчанию для основные методы

Если вы проверили, чтобы все ваши ключи совпадали, возможно, именно так определен объект Message. Это должно выглядеть примерно так: убедитесь, что это объект NSObject, а ключи (свойства) начинаются с @ objc

class Message: NSObject {
    @objc var name = ""
    @objc var toId = ""
}

Мое последнее предложение - сделать ваш код быстрым и не полагаться на NSObject.

class Message {
  var name = ""
  var toId = ""
  func initMessageWithSnap(aSnapshot: Snapshot) {
      //desconstuct the snapshot and assign the vars
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...