SWIFT:在tableview中打印firebase数据库中的数据

SWIFT:在tableview中打印firebase数据库中的数据,swift,firebase,firebase-realtime-database,tableview,Swift,Firebase,Firebase Realtime Database,Tableview,我是firebase的新手。 我想用Firebase数据库中的数据制作一个应用程序,以在tableview中显示 例如: 假设我创建了一个如下所示的数据库: { "fruits": { "Apple": { "color": "Red", "taste": "Bla bla...", }, "Banana": { "color": "Yellow", "taste": "Bla bla...", }, "

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

例如:

假设我创建了一个如下所示的数据库:

{
  "fruits": {
    "Apple": {
      "color": "Red",
      "taste": "Bla bla...",
    },
    "Banana": {
      "color": "Yellow",
      "taste": "Bla bla...",
    },
    "Pear": {
      "color": "Green",
      "taste": "Bla bla...",
    },
  }
}
Firebase会自动按字母顺序对数据库中的项目进行排序。现在,我想制作一个以字母顺序列出所有水果的tableview。当我轻触一种水果时,它会推到一个新窗口,显示有关该水果的信息,如“颜色”、“味道”等。 要记住的重要一点是,每当我向数据库中添加项目(如更多类型的水果)时,它都必须按字母顺序显示。我读过文件,但运气不好

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


谢谢。:-)

>你可能想考虑不同的结构< /P>
fruits
  fruit_id_0  <- key created with childByAutoId
    name: "Apple"
    color: "Red"
    taste: "blah blah"
从那里,任何时候一个新的水果被添加,关闭将被调用。添加新添加的水果,对数组进行排序并更新UI

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

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

下面是一些可以通过单击按钮初始化的代码

   func button0() {
      self.configureChildAdded()
      self.setInitialLoadCompleted()
   }
两个类变量用于跟踪加载过程中的位置,一个数组用于存储水果名称

var initialLoad = true
var fruitArray = [String]()
然后是两个类,它们将首先加载和排序您的水果,并留下一个.childAdded observer,它将监视其他水果并将它们添加到数据源、排序和更新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排序,因为它是在代码中完成的。这将使多字段排序等变得更容易

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
    })
}