从Swift中的Firebase读取多个子节点

时间:2017-06-15 17:18:36

标签: ios arrays swift firebase firebase-realtime-database

我有一个集合视图,我试图附加用户上传的信息。目前我的数据库看起来如下: enter image description here

我正在尝试获取标题,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但是没有错误。

2 个答案:

答案 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事件中,您将获得单个子项而不是快照集合。