如何在firebase数据中显示嵌套对象

时间:2016-12-31 11:24:27

标签: swift firebase swift3 firebase-realtime-database

如何在视图中显示以下数据:

[
  "parties" {
    "2016-12-30" {
      "uid" {
        "name": "joe",
        "age": "32"
      },
      "uid" {
        "name": "kevin",
        "age": "29"
      }
    },
    "2016-12-25" {
      "uid" {
        "name": "ben"
        "age": "44"
      }
    }
  }
]

在我的控制器中我有

var parties = [Party]()

DataService.ds.REF_PARTIES.observe(.value, with: { (snapshot) in

    if let snapshot = snapshot.children.allObjects as? [FIRDataSnapshot] {
        print(snapshot)
        for snap in snapshot {
            if let partyDict = snap.value as? [String: AnyObject] {
                let key = snap.key // the party date
                let party = Party(date: key, partyData: partyDict)
                self.parties.append(party)

            }
        }
    }
    self.tableView.reloadData()
})

类PartyFeedCell:UITableViewCell:

func configureCell(party: Party) {
 dateLabel.text = part.date // date as expected
}

在做出反应时,我可以使用Object.key深入循环并获取这些日期(密钥)的用户。有没有办法实现这个目标?在xxx日期之下,我应该看到一个用户列表。

Party.swift:

import Foundation

class Party {
  private var _name: String!
  private var _age: String!

  var name: String {
    return _name
  }

  [...]

  init(name: String, age: String) {
    self._name = name
    self._age = age
  }

  init(date: String, partyData: [String: AnyObject]) {
    self._date = date
    [...]
  }
}

DataService.swift:

import Foundation
import FirebaseDatabase

let DB_BASE = FIRDatabase.database().reference()

class DataService {

  static let ds = DataService()
  private var _REF_BASE = DB_BASE
  private var _REF_PARTIES = DB_BASE.child("parties").queryOrderedByKey()

  var REF_BASE: FIRDatabaseReference {
   return _REF_BASE 
  }

  var REF_PARTIES: FIRDatabaseQuery {
   return _REF_PARTIES
  }


}

1 个答案:

答案 0 :(得分:1)

两件事:

使用日期作为密钥...虽然可能没问题,但应该更改 - 最佳做法是将密钥与子代中包含的数据取消关联。

parties
  -Y9809s0asas
     date: "2016-12-30"
     users:
       uid_0: true
       uid_1: true
  -Y89js99skks
     date: "2016-12-15"
     users:
       uid_1: true
       uid_3: true

users
  uid_0:
    name: "ben"
    age: "42"
  uid_1:
    name: "frank"
    age: "28"
  etc

派对内的密钥由childByAutoId(Y9809s0asas等)生成

第二件事是代码看起来非常好。问题似乎是如何从字典中获取值

在这种情况下,代码将snap.value指定为[String:AnyObject]的字典给partyDict。所以在这一点上,partyDict只是一个关键词:值对

所以在你的Party课堂中,只需要完成一项简单的任务:

  init(date: String, partyData: [String: AnyObject]) {
    self._date = date
    self._age = partyData["age"]
    self._name = partyData["name"]
  }

我没有运行你的代码,但它非常接近可用。

哦 - 随着结构的这种改变,你会想要为Party类添加一个属性,key。确保将父节点名称(snap.key)传递给类,因此如果需要更新等,则会存储父节点名称(来自上述结构的Y9809s0asas)