与使用值事件类型观察firebase数据库相混淆

时间:2017-10-13 02:50:04

标签: ios swift firebase firebase-realtime-database

我是iOS开发的新手,我正在学习关于向firebase读取和写入数据的教程。我想从Firebase检索数据并用它填充tableView。

在观察引用时,使用.value数据事件类型从实时数据库中检索数据时很困惑。这是简化的代码

class Story
{
    var text = ""
    var numberOfLikes = 0
    var numberOfAngry = 0
    let ref: FIRDatabaseReference!

    init(snapshot: FIRDataSnapshot)
    {
        ref = snapshot.ref
        if let value = snapshot.value as? [String : Any] {
            text = value["text"] as! String
            numberOfLikes = value["numberOfLikes"] as! Int
            numberOfAngry = value["numberOfAngry"] as! Int
        } else {
            numberOfAngry = 0
            numberOfLikes = 0
        }
    }


}


class StoriesTableViewController: UITableViewController
{
    // MARK: - Properties
    var stories = [Story]()
    private let storiesRef = FIRDatabase.database().reference().child("stories")

    @IBOutlet weak var composeBarButtonItem: UIBarButtonItem!

    override func viewDidAppear(_ animated: Bool) {
        super.viewDidAppear(animated)



        storiesRef.observe(.value, with: { snapshot in
            self.stories.removeAll()

            for child in snapshot.children {
                let story = Story(snapshot: child as! FIRDataSnapshot)
                self.stories.append(story)
            }

            self.tableView.reloadData()
        })
    }

我的问题是......

  1. 我看了几乎相同的其他教程,只是编写简单的数据并用它填充tableview,但另一个教程只使用.childadded作为事件类型。我不明白为什么在本教程中使用了.value事件类型?因为它看起来更复杂。

  2. 为什么我们要循环snapshot.children?在创建数据库引用时,snapshot.children和child是一样的吗?

  3. 实际上我并不熟悉术语快照(FIRDataSnapshot)和参考(FIRDatabasereference)。是否有任何文章或视频解释这个术语?

  4. 我很抱歉,如果我问的问题太多而且看起来很傻,只是一个想要真正掌握这些代码的新手。提前致谢

1 个答案:

答案 0 :(得分:0)

  1. 当您观察.value事件时,您的完成处理程序将被调用一次;带有所有子节点的快照。这允许您一次处理所有子节点,这可以方便地执行更新计数器或减少表视图更新的数量。

  2. 当您使用.value事件观察Firebase数据库中的项目列表时,可能会有多个子节点。因此快照包含这些结果的列表。即使只有一个子节点,快照也将包含一个子节点的列表。因此,您的完成处理程序需要循环遍历这些结果,您可以通过迭代snapshot.children来完成。

  3. FIRDataSnapshot/DataSnapshot是一个Firebase对象,其中包含您在特定时间请求的数据的快照。