如何循环遍历 Firebase 数据

coo*_*ool 3 ios firebase swift firebase-realtime-database

如何在 Swift 4 中循环遍历实际上是对象的 Firebase 数据(子级)并访问其属性?

作为 Swift 的初学者,我试图循环访问从 Firebase 检索的数据,并且尝试访问这些对象的属性。看起来要复杂得多,然后应该很快(只是我的主观意见)

根据Firebase 网站上的文档,这就是我所拥有的

_commentsRef.observe(.value) { snapshot in
    for child in snapshot.children {
        // Access to childs here ...
    }
}
Run Code Online (Sandbox Code Playgroud)

现在,结合上面的内容以及我在网上找到的教程和解释(顺便说一句,找不到任何一个可以充分解释这一点),这就是我所拥有的:

ref.child("activities").child("list").observeSingleEvent(of: .value, with: { (snapshot) in
    // The list i got here is the list of the childs which are objects
    // Lets loop through that list and pull properties we need
    for child in snapshot.children.allObjects as! [DataSnapshot] {
        print(child.value)
    }
})
Run Code Online (Sandbox Code Playgroud)

循环中的打印将正确显示对象及其所有属性,但我无法访问这些属性。使用“child.value.title”之类的内容访问它会导致错误“类型‘Any’的值没有成员‘标题’”

我是否需要转换child.value为其他内容,也许将其强制转换或以某种方式将其转换为属性可访问的 JSON 或类似的内容?

Fra*_*len 5

如果您调用value包含多个属性的快照,您将得到一个NSDictionary以属性名称作为键的 。因此,要获取密钥的值,title您需要执行以下操作:

for child in snapshot.children.allObjects as! [DataSnapshot] {
    print(child.value)
    let dict = child.value as? [String : AnyObject] ?? [:]
    print(dict["title"])
}
Run Code Online (Sandbox Code Playgroud)

或者,您可以使用 的其他成员DataSnapshot导航到该title属性,然后调用.value该属性:

for child in snapshot.children.allObjects as! [DataSnapshot] {
    print(child.value)
    print(child.childSnapshot(forPath: "title").value)
}
Run Code Online (Sandbox Code Playgroud)

请参阅DataSnapshot.value以及Firebase 文档中有关读取数据的第一个示例