我是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()
})
}
我的问题是......
我看了几乎相同的其他教程,只是编写简单的数据并用它填充tableview,但另一个教程只使用.childadded作为事件类型。我不明白为什么在本教程中使用了.value事件类型?因为它看起来更复杂。
为什么我们要循环snapshot.children?在创建数据库引用时,snapshot.children和child是一样的吗?
实际上我并不熟悉术语快照(FIRDataSnapshot)和参考(FIRDatabasereference)。是否有任何文章或视频解释这个术语?
我很抱歉,如果我问的问题太多而且看起来很傻,只是一个想要真正掌握这些代码的新手。提前致谢
答案 0 :(得分:0)
当您观察.value
事件时,您的完成处理程序将被调用一次;带有所有子节点的快照。这允许您一次处理所有子节点,这可以方便地执行更新计数器或减少表视图更新的数量。
当您使用.value
事件观察Firebase数据库中的项目列表时,可能会有多个子节点。因此快照包含这些结果的列表。即使只有一个子节点,快照也将包含一个子节点的列表。因此,您的完成处理程序需要循环遍历这些结果,您可以通过迭代snapshot.children
来完成。
FIRDataSnapshot
/DataSnapshot
是一个Firebase对象,其中包含您在特定时间请求的数据的快照。