首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SWIFT:在tableview中打印来自firebase数据库的数据

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

Stack Overflow用户
提问于 2018-08-08 08:09:42
回答 1查看 183关注 0票数 0

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

示例:

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

代码语言:javascript
复制
{
  "fruits": {
    "Apple": {
      "color": "Red",
      "taste": "Bla bla...",
    },
    "Banana": {
      "color": "Yellow",
      "taste": "Bla bla...",
    },
    "Pear": {
      "color": "Green",
      "taste": "Bla bla...",
    },
  }
}

Firebase会自动按字母顺序对数据库中的项目进行排序。现在我想做一个按字母顺序列出所有水果的表视图。当我点击一个水果时,它会推送到一个新的窗口,上面有关于那个特定水果的信息,比如“颜色”、“味道”等等。重要的是要记住的是,每当我向我的数据库添加项目(比如更多种类的水果)时,它必须按字母顺序显示。我已经阅读了文档,但没有任何运气。

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

谢谢。:-)

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-08-09 02:16:04

您可能需要考虑不同的结构

代码语言:javascript
复制
fruits
  fruit_id_0  <- key created with childByAutoId
    name: "Apple"
    color: "Red"
    taste: "blah blah"

从那时起,你有一大堆选择。

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

代码语言:javascript
复制
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进行排序和更新,一遍又一遍,这可能会导致闪烁或其他不希望看到的结果。

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

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

代码语言:javascript
复制
   func button0() {
      self.configureChildAdded()
      self.setInitialLoadCompleted()
   }

两个类变量用于跟踪我们在加载过程中所处的位置,数组用于存储水果名称

代码语言:javascript
复制
var initialLoad = true
var fruitArray = [String]()

然后是两个类,它们最初将加载和排序您的水果,并留下一个.childAdded观察器,它将监视其他水果并将它们添加到dataSource、排序和更新tableView

代码语言:javascript
复制
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排序,因为它是在代码中完成的。这将使多字段排序等工作变得更容易。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51736989

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档