【问题标题】:Getting posts associated to specific user with Firebase and Swift使用 Firebase 和 Swift 获取与特定用户相关联的帖子
【发布时间】:2019-11-09 21:52:04
【问题描述】:

我有一段代码可以从我的 Firebase 数据库中提取所有帖子。我正在尝试让代码拉取特定用户 ID 的所有帖子。我的数据库的结构是用户 ID 有一组与之关联的帖子 ID。

我必须拉出所有帖子的代码:

DataService.ds.REF_POSTS.observe(.value, with: { (snapshot) in
    self.posts = []
    if let snapshot = snapshot.children.allObjects as? [DataSnapshot] {
        for snap in snapshot {
            print("SNAP: \(snap)")
            if let postDict = snap.value as? Dictionary<String, AnyObject> {
                let key = snap.key
                let post = Post(postKey: key, postData: postDict)
                self.posts.append(post)
            }
        }
    }
    self.feedTableView.reloadData()
})

我如何识别当前用户:

_ = Auth.auth().addStateDidChangeListener { (auth,user) in
            if let user = user {
                let userId = user.uid
                print("USER: \(String(describing: userId))")
                let newPost = DataService.ds.REF_USERS.child("\(userId)").child("posts")
                //print("NEW POST: \(newPost.child)")
                newPost.setValue([userPost : true])

            }
        }

看起来我需要访问用户对象的子(帖子),然后循环浏览帖子。如何循环浏览(并观察更改)与已登录用户关联的帖子?

编辑(尝试循环浏览用户的所有帖子):

_ = Auth.auth().addStateDidChangeListener { (auth,user) in
    if let user = user {
        let userId = user.uid
        print("USER: \(String(describing: userId))")
        let newPost = DataService.ds.REF_USERS.child("\(userId)").child("posts")
        newPost.observe(.value, with: { (snapshot) in
            self.posts = []
            if let snapshot = snapshot.children.allObjects as? [DataSnapshot] {
                for snap in snapshot {
                    print("ERIC SNAP: \(String(describing: snap.value))")
                    if let postDict = snap.value as? Dictionary<String, AnyObject> {
                        let key = snap.key
                        let post = Post(postKey: key, postData: postDict)
                        self.posts.append(post)
                    }
                }
            }
            self.feedTableView.reloadData()
        })
        //print("NEW POST: \(newPost)")

    }
}

【问题讨论】:

  • 您需要为每个帖子附加一个侦听器,在该用户节点下您有一个密钥。
  • @FrankvanPuffelen 我在上面添加了一个编辑。这是你推荐的吗?有些东西似乎仍然不对劲,因为我打印 ERIC SNAP 时得到的值是 ERIC SNAP: Optional(1)

标签: swift firebase firebase-realtime-database


【解决方案1】:

获取已登录用户帖子的方法如下:

guard let uid = Auth.auth().currentUser?.uid else {
            return
        }
        print("USER ID: \(uid)")
        let newPost = DataService.ds.REF_USERS.child("\(uid)").child("posts")

        newPost.observe(.value, with: { (snapshot) in
            self.posts = []
            if let snapshot = snapshot.children.allObjects as? [DataSnapshot] {
                for snap in snapshot {
                    let postData = DataService.ds.REF_POSTS.child(snap.key)
                    postData.observe(.value, with: { (snapshot) in
                        if let postDict = snapshot.value as? Dictionary<String, AnyObject> {
                            let key = snapshot.key
                            let post = Post(postKey: key, postData: postDict)
                            self.posts.append(post)
                        }
                        self.feedTableView.reloadData()
                    })
                }
            }

        })

【讨论】:

    猜你喜欢
    • 2021-12-23
    • 1970-01-01
    • 2016-04-14
    • 1970-01-01
    • 2019-04-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多