override func viewDidLoad() {
super.viewDidLoad()
getImageUrl()
}
func getImageUrl(){
ref.child("posts").queryOrderedByKey().observeSingleEvent(of: .value) { (snapchot) in
let postsss = snapchot.value as! [String : AnyObject]
for (_,posst) in postsss {
if let uid = posst["userID"] as? String{
if uid == Auth.auth().currentUser?.uid{
if let myPostURL = posst["pathToImage"] as? String{
self.imageURLs.append(myPostURL)
}
}
}
}
}
}
我希望我的代码能够浏览Firebase上的所有帖子,然后检查他们的userID是否与当前用户uid匹配,如果匹配则表示他们是我的图片。然后将pathToImage
中的URL发送到我的代码中的一个名为imageURLs()[“”]的数组中。但我不知道该怎么做?我正在使用SDWebImage将我的图像显示到collectionView单元格。我测试了它,如果我在一个名为imageURLs [“URL here”]
我是Swift和Firebase的新手,所以任何帮助都会非常感激!! :)
这是我的火葬文件的图像。 https://ibb.co/bXLMcb
嘘! posts / pathToImage保存URL,这是我想要检索的URL。
users / urlToImage只是个人资料图片。我现在不需要它
答案 0 :(得分:0)
您应该考虑在数据库中的某个位置存储所有用户帖子的索引。这样你就不需要每次都观察所有帖子。这称为非规范化。 Firebase在其文档中有一篇关于组织数据库的文章。
Here's some information regarding firebase filtering in swift。
最佳解决方案是添加一个单独的节点,其中包含由用户组织的“帖子ID”列表。然后你可以观察那个节点,并且只用返回的ID专门下载每个帖子。 Here's a link about flattening data structures in firebase。它看起来像这样。
"posts":{
"somePostID":{
"timestamp": "0200231023",
"postContent": "here's my post content",
"authorUID" : "0239480238402934"
} ...
},
"postsByGivenUID":{
"someAuthorID":{
"somePostID": "true",
"somePostID": "true",
},
"someOtherAuthorID":{
"somePostID": "true",
"somePostID": "true",
"somePostID": "true"
}
}
这实际上是一个更大的问题,而不仅仅是改变你的代码结构。为了扩展性,您将不得不重新评估如何在firebase中构建数据的方式。
然后,您可以嵌套您的firebase查询,如下所示:
ref.child("postByGivenUID").child("Auth.auth().currentUser?.uid").observe(.childAdded) { (snapshot) in
ref.child("posts").child(snapshot.value).observeSingleEventOfType(of: .value) { (snap) in
// your actual post data will be here
// that way you won't be downloadin ALL posts EVERY time
}
}
答案 1 :(得分:0)
要在节点中查找特定数据,请使用Query。
虽然在节点上进行迭代工作,但如果有一百万个节点,它会花费很长时间并占用UI,同时等待它发生。
底线是;如果你知道你在寻找什么 - 在这种情况下是一个uid - 那么查询就是一个超级简单的解决方案。
let postsRef = self.ref.child("posts")
let query = postsRef.queryOrdered(byChild: "userID").queryEqual(toValue: "uid_0")
query.observeSingleEvent(of: .value) { (snapshot) in
if snapshot.exists() {
for child in snapshot.children { //.value can return more than 1 match
let snap = child as! DataSnapshot
let dict = snap.value as! [String: Any]
let myPostURL = dict["urlToImage"] as! String
self.imageURLs.append(myPostURL)
}
} else {
print("no user posts found")
}
}
使用上面的代码,我们首先创建对posts节点的引用。然后是一个只返回此用户(uid_0)帖子的查询。
然后我们迭代帖子的快照并将它们添加到数组中。
这样可以更有效地加载和评估数据库中的每个节点。
有关详细信息,请参阅Sorting And Filtering数据。