遍历Firebase数据库以在Swift中构建表列表

时间:2018-12-10 22:11:59

标签: swift firebase firebase-realtime-database

我有一张桌子。内部有一个表格单元格。我希望我的客户出现在列表中。客户端列表来自Firebase数据库。

因此,我设置了表视图并定义了一个空的客户端数组

class ClientViewController: UIViewController, UITableViewDataSource, UITableViewDelegate {

    var clients = Array<Any>()

    @IBOutlet weak var tableView: UITableView!

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "clientsCell", for: indexPath as IndexPath)
        cell.textLabel?.text = clients[indexPath.row] as? String
        return cell
    }

    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return clients.count
    }

加载视图后,(我很确定是问题所在)我尝试通过数据库引用并将公司名称附加到空客户数组中

override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
        var ref: DatabaseReference!

        ref = Database.database().reference()

        ref.child("clients").observeSingleEvent(of: .value, with: { (snapshot) in

            for client in snapshot.children.allObjects as! [DataSnapshot] {
                let company = client.childSnapshot(forPath: "company").value
                self.clients.append(company ?? "No company name")
            }

        }) { (error) in
            print(error.localizedDescription)
        }
    }

如果我对客户端数组进行硬编码,则效果很好。因此,我认为迭代是在表生成之后发生的。我怎样才能像我一样需要它?

1 个答案:

答案 0 :(得分:0)

for循环后,重新加载表

for client in snapshot.children.allObjects as! [DataSnapshot] {
    let company = client.childSnapshot(forPath: "company").value
    self.clients.append(company ?? "No company name")
} 
self.tableView.reloadData()

如果最终将转换为Any,请避免输入String

var clients = [String]()