SWIFT:在tableview中从Firebase数据库打印数据

时间:2018-08-08 00:09:42

标签: swift firebase firebase-realtime-database tableview

我是Firebase的新手。 我想用我的Firebase数据库中的数据制作一个应用程序,以显示在表格视图中。

示例:

假设我建立了一个数据库,如下所示:

{
  "fruits": {
    "Apple": {
      "color": "Red",
      "taste": "Bla bla...",
    },
    "Banana": {
      "color": "Yellow",
      "taste": "Bla bla...",
    },
    "Pear": {
      "color": "Green",
      "taste": "Bla bla...",
    },
  }
}

Firebase自动按字母顺序对数据库中的项目进行排序。现在,我想用字母顺序列出的所有水果制作一个tableview。当我点击一个水果时,它将推到一个新窗口,其中包含有关该特定水果的信息,例如“颜色”,“口味”等。 要记住的重要一点是,每当我向数据库中添加项目时(例如更多类型的水果),它都必须保持按字母顺序显示。我已经阅读了文档,但是没有运气。

我该怎么做?我知道如何制作表视图和创建数据库。但是,如何将数据库连接到表格视图,并使其从a-z打印出我的数据?也许按索引号?

谢谢。 :-)

1 个答案:

答案 0 :(得分:0)

您可能要考虑其他结构

fruits
  fruit_id_0  <- key created with childByAutoId
    name: "Apple"
    color: "Red"
    taste: "blah blah"

从那里您有很多选择。

一个选项是使用.childAdded,它将一次遍历所有节点,并留下一个观察者,每当添加一个新孩子时,该观察者就会通知应用程序。 dataSource数组按名称在代码中排序。

let fruitsRef = self.ref.child("fruits")
fruitsRef.observe(.childAdded, with: { snapshot in
    let fruitDict = snapshot.value as! [String: Any]
    let fruitName = fruitDict["name"] as! String
    self.fruitArray.append(fruitName)
    self.fruitArray.sort() //sorts in place
    self.myTableView.reloadData()
})

从那里开始,只要添加新的水果,就会调用闭包。新添加的水果已添加,数组排序并更新了UI。

如果您只有几个条目,上面的内容就可以了,但是如果您像我一样有很多水果,则它将在加载每个水果后对tableView进行排序和更新,这可能会导致闪烁或其他不期望的结果结果。

一个更好的选择是利用.value观察者出现在.child添加观察者之后的事实。考虑到这一点,您可以加载整个初始数据集,完成后,对其进行排序并更新tableView。同时让新水果的观察者将其添加到数据源中,对UI进行排序和更新。

以下是一些通过单击按钮即可启动的代码

   func button0() {
      self.configureChildAdded()
      self.setInitialLoadCompleted()
   }

两个类vars来跟踪加载过程中的位置,以及一个数组来存储水果名称

var initialLoad = true
var fruitArray = [String]()

然后是两个类,它们最初将对您的水果进行加载和排序,并留下一个.childAdded观察器,该观察器将监视其他水果并将其添加到数据源中,进行排序并更新tableView

func configChildAdded() {
    let fruitsRef = self.ref.child("fruits")
    fruitsRef.observe(.childAdded, with: { snapshot in //iterate over all fruits
        let fruitDict = snapshot.value as! [String: Any]
        let fruitName = fruitDict["name"] as! String
        self.fruitArray.append(fruitName)

        //upon first load, don't reload the tableView until all children are loaded
        if ( self.initialLoad == false ) {
            self.fruitArray.sort()
            self.myTableView.reloadData()
        }
    })
}

//this .value event fires AFTER the child added events to load the tableView the first time
//  all this does is update the UI and set the initalLoad to true and only fires once
func setInitialLoadCompleted() {
    let fruitsRef = self.ref.child("fruits")
    fruitsRef.observeSingleEvent(of: .value, with: { snapshot in
        self.myTableView.reloadData()
        self.initialLoad = false
    })
}

请注意,使用此方法将完全避免使用代码中已完成的任何Firebase排序。这样可以更轻松地进行多字段排序等。