无法将Firebase数据库中的数据保存到阵列

时间:2018-01-02 12:16:17

标签: ios swift firebase firebase-realtime-database

*我对swift很新。

我目前正在使用Swift 4,Xcode 9和Firebase。我的目标是创建一个应用程序,将数据存储在列表中,将其显示在表视图中,并允许用户向列表中添加更多数据。我停留在显示数据部分,我创建了一个应该从数据库获取数据的函数,然后将其添加到数组中,以便我可以在自定义表视图单元格上显示它的各个部分。这是我的代码:

class OrdersPage: UIViewController, UITableViewDelegate, UITableViewDataSource {

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

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: "orderCell", for: indexPath) as! OrderCell
    cell.setOrder(order: orders[indexPath.row])
    print("Adding new cell")
    return cell
}

@IBOutlet weak var tableView: UITableView!
var ref: DatabaseReference!
var orders = [Order]()

override func viewDidLoad() {
    super.viewDidLoad()
    tableView.delegate = self
    tableView.dataSource = self

    self.ref = Database.database().reference()
    orders = getOrders()
}

func getOrders() -> [Order] {
    var tempArray = [Order]()
    ref.child("Orders").observe(.value) { (snapshot) in
        for child in snapshot.children {
            let orderDB = child as! DataSnapshot
            let orderDict = orderDB.value as! [String: Any]

            let name = orderDict["name"] as! String
            let date = orderDict["date"] as! String
            let time = orderDict["time"] as! String
            let hotel = orderDict["hotel"] as! String
            let room = orderDict["room"] as! String
            let airport = orderDict["airport"] as! String
            let agent = orderDict["agent"] as! String
            let price = orderDict["price"] as! String
            //let submitted = orderDict["submitted"] as! String
            tempArray.append(Order(name: name, date: date, time: time, hotel: hotel, room: room, airport: airport, agent: agent, price: price))
        }
    }
    return tempArray
}

根据我的测试,问题是在调用numberOfRowsInSection时,orders数组不包含任何内容,因此它不会在表视图中创建任何单元格。我不确定为什么它不能正常工作并且已经坚持了很长一段时间了,任何帮助都会受到赞赏。

2 个答案:

答案 0 :(得分:1)

getOrders()是异步调用,因此您需要在从服务器获取数据后重新加载表。

这是你实现这一目标的方式。

替换:

func getOrders() -> [Order]

func getOrders()

您的getOrders方法将如下所示:

func getOrders() {

    ref.child("Orders").observe(.value) { (snapshot) in
        for child in snapshot.children {
            let orderDB = child as! DataSnapshot
            let orderDict = orderDB.value as! [String: Any]

            let name = orderDict["name"] as! String
            let date = orderDict["date"] as! String
            let time = orderDict["time"] as! String
            let hotel = orderDict["hotel"] as! String
            let room = orderDict["room"] as! String
            let airport = orderDict["airport"] as! String
            let agent = orderDict["agent"] as! String
            let price = orderDict["price"] as! String
            //let submitted = orderDict["submitted"] as! String

            //Add your data into array
            self.orders.append(Order(name: name, date: date, time: time, hotel: hotel, room: room, airport: airport, agent: agent, price: price))
        }

        //Reload your tableView here
        DispatchQueue.main.async {
            self.tableView.reloadData()
        }
    }
}

我更新了内部代码。检查评论。

现在使用viewDidLoad方法替换:

orders = getOrders()

使用

getOrders()

答案 1 :(得分:0)

您可以在定义didSet变量时使用self.orders来重新加载UITableView

当您将任何数据分配到self.orders

时,您的表格会自动重新加载

替换你的声明

var orders = [Order]()

以下代码

var orders : [Order] = [] {
        didSet {
            tableView.reloadData()
        }
    }