我有一个集合视图,我试图附加用户上传的信息。目前我的数据库看起来如下:
我正在尝试获取标题,audioURl,描述,图像等。&将它们附加到我的数组中。问题是我每次尝试都会遇到崩溃。我对Firebase& amp;我还在学习。
目前我的检索代码如下:
let ref = FIRDatabase.database().reference().child("users").child(FIRAuth.auth()!.currentUser!.uid).child("uploads").child("allUploads")
ref.observe(.value, with: {(snap: FIRDataSnapshot) in
print(snap)
let track = TracksInfo()
let snapshotDictionnary = snap.value! as? [String: AnyObject]
track.trackName = snapshotDictionnary?["Title"] as! String
track.urlToRecording = snapshotDictionnary?["audioUrl"] as! String
track.urlToAlbumArtWork = snapshotDictionnary?["imageUrl"] as! String
self.tracks.append(track)
})
我如何访问每个上传信息&将它们添加到我的数组中?我需要进行某种查询吗?
我的崩溃发生在@ track.trackName = snapshotDictionnary?["Title"] as! String
但是没有错误。
答案 0 :(得分:1)
您需要遍历所有这些上传节点。您当前的代码一次处理完整的allUploads
节点;)因此,您需要下降一个级别以获取所需的信息。
一种快速的方法是观察.childAdded
而不是.value
。例如:
ref.observe(.childAdded, with: {(snap: FIRDataSnapshot) in
...
})
顺便说一句,如果你只想阅读一次,那么使用observeSingleEvent
可能更适合这里。
答案 1 :(得分:1)
问题在于,您的snap
对象本身就是子快照的集合,因此它没有像" Title"这样的元素。和" audioURL"。然而,它的孩子呢。所以你可能想要更像这样的东西:
ref.observe(.value, with: {(snap: FIRDataSnapshot) in
print(snap)
for child in snap.children {
if let child = child as? FIRDataSnapshot {
let track = TracksInfo()
let snapshotDictionnary = child.value! as? [String: AnyObject]
track.trackName = snapshotDictionnary?["Title"] as! String
// etc...
self.tracks.append(track)
}
}
})
Paulo的建议也有效。在.childAdded
事件中,您将获得单个子项而不是快照集合。