Преобразование Firebase Datasnapshot в кодируемые данные JSON - PullRequest
0 голосов
/ 01 декабря 2018

Я использую базу данных Firebase и пытаюсь получить и использовать данные с помощью NSObject.Я получаю сообщение об ошибке NSUnknownKeyException при запуске приложения, которое вызывает его сбой.

NSObject:

class WatchList: NSObject {

var filmid: Int?

}

Код Firebase:

ref.child ("users"). Child (uid!). Child ("список наблюдения").DataEventType.childAdded, с: {(info) в

            print(info)

            if let dict = info.value as? [String: AnyObject] {
                let list = WatchList()
                list.setValuesForKeys(dict)
                print(list)
            }

    }, withCancel: nil)

Я не уверен, что может вызвать это.

Кроме того, усовершенствование этого решения - это способ получения этих данных ивместо использования NSObject я мог бы использовать Codable и JSONDecoder с данными Firebase?

Ответы [ 2 ]

0 голосов
/ 04 января 2019

Вы можете просто использовать JSONSerialization для преобразования свойства значения снимка из Any в Data:

let data = try? JSONSerialization.data(withJSONObject: snapshot.value)

Вы также можете расширить тип Firebase DataSnapshot и добавить в него свойства строки данных и json:

import Firebase 

extension DataSnapshot {
    var data: Data? {
        guard let value = value else { return nil }
        return try? JSONSerialization.data(withJSONObject: value)
    }
    var json: String? {
        return data?.string
    }
}
extension Data {
    var string: String? {
        return String(data: self, encoding: .utf8)
    }
}

использование:

guard let data = snapshot.data else { return }
0 голосов
/ 01 декабря 2018

Очень хорошая библиотека для использования здесь - Codable Firebase , которую я также использую в своем проекте.Просто приведите ваш класс / структуру в соответствие с протоколом Codable и используйте FirebaseDecoder для декодирования ваших данных Firebase в объект Swift.

Пример:

Database.database().reference().child("model").observeSingleEvent(of: .value, with: { snapshot in
    guard let value = snapshot.value else { return }
    do {
        let model = try FirebaseDecoder().decode(Model.self, from: value)
        print(model)
    } catch let error {
        print(error)
    }
})
...