Firebase在swift中检索autoId值

时间:2017-12-10 10:51:26

标签: ios swift firebase firebase-realtime-database

我想检索图片值。节点看起来像这样,我想检索url1,url2,url3。

 "Post": {
    "uid": {
      "Text": "some text",
      "images": {
         autoID1: url1,
         autoID2: url2,
         autoID3: url3
      }
    }
  }

问题是密钥是自动生成的。所以,我通常会这样投。

if let dictionary = snapshot.value as? [String:Anyobject] 
let text = dictionary["text"] as? String

但在这种情况下我不知道如何转换autoID键并获取值。 我试过下面的代码,但错误说

  

无法将类型'__NSDictionaryM'(0x10af491c8)的值转换为   'NSString'(0x10a0bad68)。

 func fetchImages() {
    ref.child("Post").child(uid!).child("images").observe(.value, with: { (snapshot) in

            let downloadUrl = snapshot.value as! String
            let stoRef = Storage.storage().reference(forURL: downloadUrl)

            stoRef.getData(maxSize: 1*1024*1024, completion: { (data, error) in
                let pic = UIImage(data: data!)
                self.imagesArray.append(pic!)
            })

    }, withCancel: nil)
}

如果有三个网址,我应该使用for snap in snapshot.children来循环吗?我应该如何遍历这些网址并放入imagesArray? 提前谢谢!

1 个答案:

答案 0 :(得分:1)

你非常接近。要记住的是,当你得到

.child("images")

它实际上是一个包含子项的节点

"images": {
   autoID1: url1,
   autoID2: url2,
   autoID3: url3

并且不是字符串,而是另一个键:值对,其中键是"图像"并且值是子节点。

要获取子节点,请遍历快照中的子节点,将每个节点作为快照(另一个键:值对)投射,其中键为autoID1等,值为url(字符串)

let imagesRef = self.ref.child("Post").child("uid_0").child("images")
imagesRef.observeSingleEvent(of: .value, with: { snapshot in
    for child in snapshot.children {
        let snap = child as! DataSnapshot
        //let key = snap.key  //autoID1, autoID2 etc
        let downloadUrl = snap.value as! String
        let stoRef = Storage.storage().reference(forURL: downloadUrl)
        //get your pic
    }
})

如果ref是一个类var,就像它出现在你的问题中一样,它应该被引用为

self.ref

此外,如果您想让观察者留在节点上以便收到更改通知,请使用.observe。在我的情况下,我只想阅读它一次,所以我使用observeSingleEvent,因为我只想读一次。