使用 Codable 和 CodableFirebase 快速解析 Firebase 值时为零

New*_*bie 2 ios firebase swift firebase-realtime-database

我正在使用 Firebase 实时数据库,在 swift 和外部库 CodableFirebase 中使用可编码方法。我已经创建了模型结构,但是当我尝试使用模型结构解析值(因为我正在获取所有值)时,它给了我零。我的数据库有键,我可能没有正确处理嵌套值。请帮忙。谢谢

附上数据库结构快照。

数据库

代码:

Database.database().reference().child("users").observeSingleEvent(of: .value, with: { (snapshot) in
            guard let value = snapshot.value as? [String: Any] else { return }
            do {

                let friendList = try FirebaseDecoder().decode(Response.self, from: value)

                guard let conversationUid = value["conversationUid"] as? String,
                let friendStatus = value["friendStatus"] as? String,
                let notify = value["notify"] as? Bool,
                let phNumber = value["phoneNumber"] as? String,
                let uid = value["uid"] as? String
                else { return }


            } catch let error {
                print(error)
            }
        })
Run Code Online (Sandbox Code Playgroud)

JSON:

{
  "FTgzbZ9uWBTkiZK9kqLZaAIhEDv1" : {
    "friends" : {
      "zzV6DQSXUyUkPHgENDbEjXVBj2" : {
        "conversationUid" : "-L_w2yi8gh49GppDP3r5",
        "friendStatus" : "STATUS_ACCEPTED",
        "notify" : true,
        "phoneNumber" : "+9053",
        "uid" : "zzV6DQSXUyUkPHgEZ9EjXVBj2"
      }
    },
    "lastLocation" : {
      "batteryStatus" : 22,
      "latitude" : 48.90537,
      "longitude" : 28.042,
      "timeStamp" : 1556568633477,
      "uid" : "FTgzbZ9uWkiZK9kqLZaAIhEDv1"
    },
    "profile" : {
      "fcmToken" : "fp09-Y9ZAkQ:APA91bFgGBsyFx0rtrz7roxzpE_MmuSaMc4is-XIu7j718qjRVCSHY4PvbNjL1LZ-iytaeDKviIRMH",
      "name" : "Mt Bt",
      "phoneNumber" : "+90503",
      "uid" : "FTgzbZ9uWBTkiZLZaAIhEDv1"
    }
  }
Run Code Online (Sandbox Code Playgroud)

模型:

struct Response : Codable {

    let friends : Friend?
    let lastLocation : LastLocation?
    let profile : Profile?
}

struct Friend: Codable {
    let converstionUid: String?
    let friendStatus: String?
    let notify: Bool?
    let phoneNumber: String?
    let uid: String?

}

struct Profile : Codable {

    let fcmToken : String?
    let name : String?
    let phoneNumber : String?
    let uid : String?
}

struct LastLocation : Codable {

    let batteryStatus : Int?
    let latitude : Float?
    let longitude : Float?
    let timeStamp : Int?
    let uid : String?
}

Run Code Online (Sandbox Code Playgroud)

Fra*_*len 5

您的代码正在读取整个users节点,然后尝试conversationUid从该节点读取和其他属性。由于这些属性不直接users存在node 下,因此您将获得 null。

要正确解析此 JSON,您需要在尝试读取命名属性(如conversationUid.

Database.database().reference().child("users").observeSingleEvent(of: .value, with: { (snapshot) in
  for userSnapshot in snapshot.children.allObjects as! [DataSnapshot] {
    let friendsSnapshot = userSnapshot.childSnapshot(forPath: "friends")
    for friendSnapshot in friendsSnapshot.children.allObjects as! [DataSnapshot] {

      guard let value = friendSnapshot.value as? [String: Any] else { return }
      do {
        guard let conversationUid = value["conversationUid"] as? String,
        ...
Run Code Online (Sandbox Code Playgroud)

上面的代码首先循环遍历 下的一级子节点/users,然后循环遍历friends每个用户的节点的子节点。