我想检索图片值。节点看起来像这样,我想检索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?
提前谢谢!
答案 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,因为我只想读一次。