2017-06-15 27 views
1

我有一个集合视图,我试图附加用户上传的信息。目前我的数据库看起来如下: enter image description here在Swift中从Firebase中读取多个子节点

我试图获得标题,audioURL,说明,图像等&追加到我的数组中。问题是每当我尝试去做,我都会崩溃。我相对较新的Firebase &仍在继续学习。

目前我检索代码如下:

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但是没有错误。

回答

1

您需要遍历所有这些上传的节点。您当前的代码一次处理完整的allUploads节点;)因此,您需要下降一个级别以获取所需的信息。

做一个快速的方法是观察.childAdded而不是.value。例如:

ref.observe(.childAdded, with: {(snap: FIRDataSnapshot) in 
    ... 
}) 

顺便说一句,如果你只是想读取数据一次,使用observeSingleEvent可能是一个更适合这里。

+0

除了这个之外,我还会使用循环吗? – AndrewS

+0

@AndrewS没有循环需要;)只需使用原来的代码... –

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

+0

'print(track.trackName = snapshotDictionnary?[“Title”] as!String)'任何想法为什么这会出现空白,当有一个名为“Test Totle”的值 – AndrewS

相关问题