【问题标题】:Converting Firebase Datasnapshot to codable JSON data将 Firebase 数据快照转换为可编码的 JSON 数据
【发布时间】:2019-05-03 01:55:55
【问题描述】:

我正在使用 Firebase 数据库,并尝试通过 NSObject 检索和使用数据。我在运行应用程序时收到NSUnknownKeyException 错误,导致它崩溃。

NSObject:

class WatchList: NSObject {

    var filmid: Int?

}

Firebase 代码:

ref.child("users").child(uid!).child("watchlist").observe(DataEventType.childAdded, with: { (info) in
    print(info)
    
    if let dict = info.value as? [String: AnyObject] {
        let list = WatchList()
        list.setValuesForKeys(dict)
        print(list)
    }        
}, withCancel: nil)

我不确定是什么原因造成的。

此外,增强此解决方案是他们获取此数据的一种方式,而不是使用 NSObject,而是将 CodableJSONDecoder 与 Firebase 数据一起使用?

【问题讨论】:

    标签: json swift firebase codable


    【解决方案1】:

    现在是 2021 年。

    Firebase 终于增加了对解码 Firestore 文档的支持。只需让您的对象符合Codable 并像这样解码:

    let result = Result {
      try document?.data(as: City.self)
    }
    switch result {
    case .success(let city):
        if let city = city {
            print("City: \(city)")
        } else {
            print("Document does not exist")
        }
    case .failure(let error):
        // A `City` value could not be initialized from the DocumentSnapshot.
        print("Error decoding city: \(error)")
    }
    

    别忘了添加'FirebaseFirestoreSwift' pod,然后将其导入到您的文件中。

    阅读更多: https://firebase.google.com/docs/firestore/query-data/get-data#custom_objects

    原答案

    在这里使用的一个非常好的库是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)
        }
    })
    

    【讨论】:

      【解决方案2】:

      您可以简单地使用 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, !(value is NSNull) else { return nil }
              return try? JSONSerialization.data(withJSONObject: value)
          }
          var json: String? { data?.string }
      }
      extension Data {
          var string: String? { String(data: self, encoding: .utf8) }
      }
      

      用法:

      guard let data = snapshot.data else { return }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-04-02
        • 1970-01-01
        • 2019-01-19
        • 2017-10-13
        • 2018-11-16
        相关资源
        最近更新 更多