从firebase检索我的帖子并将其显示在我的collectionView Cells上? IOS

时间:2017-11-11 02:15:26

标签: ios swift xcode firebase

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”]

的数组中复制并粘贴随机URL,它工作正常

我是Swift和Firebase的新手,所以任何帮助都会非常感激!! :)

这是我的火葬文件的图像。 https://ibb.co/bXLMcb

嘘! posts / pathToImage保存URL,这是我想要检索的URL。

users / urlToImage只是个人资料图片。我现在不需要它

2 个答案:

答案 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数据。