无法从Firebase-Swift

时间:2018-10-24 14:57:16

标签: swift firebase firebase-realtime-database

我想从Firebase数据库中加载当前用户的帖子。

这是我数据库的体系结构: enter image description here 我已经成功地将所有帖子加载到了主视图中,但是当我尝试在此处进行重复并使用相同的方法进行必要的更改并将uid用于当前用户的帖子时,它什么也没显示。关于可能的问题,可以寻求帮助。

这是ProfileUserPosts swift文件的屏幕截图: enter image description here

    //VARS
    var postsuser = [ProfileUserPosts]()    

@objc func observeUserPosts() {
        let uid = Auth.auth().currentUser?.uid
        let postsRef = Database.database().reference().child("posts").child("author")
         postsRef.queryOrdered(byChild: "userid").queryEqual(toValue: uid!).observe(.value) { (snapshot) in

            var tempPost = [ProfileUserPosts]()

            for child in snapshot.children {
                if let childSnapshot = child as? DataSnapshot {

                    let dict = childSnapshot.value as? [String: Any]

                    //Post Picture
                    let photoUrl = dict!["photoUrl"] as? String
                    let url = URL(string: photoUrl!)

                    //Info Post
                    let comments = dict!["comments"] as? String
                    let city = dict!["city"] as? String
                    let municipality = dict!["municipality"] as? String
                    let breed = dict!["breed"] as? String
                    let phoneuser = dict!["phone"] as? String
                    let postType = dict!["postType"] as? String
                    let petType = dict!["petType"] as? String
                    let gender = dict!["gender"] as? String
                    let timestampadoption = dict!["timestamp"] as? Double
                    let date = Date(timeIntervalSince1970: timestampadoption!/1000)

                    let post = ProfileUserPosts(breed: breed!, phone: phoneuser!, photoUrl: url!, city: city!, municipality: municipality!, petType: petType!, gender: gender!, timestamp: date, postType: postType!, comments: comments!)

                    tempPost.insert(post, at: 0)
                }

                DispatchQueue.main.async {
                    self.postsuser = tempPost
                    self.postsCollectionView.reloadData()
                    self.refresher.endRefreshing()
                }
            }
        }
    }

在这里,我使用numberOfItemsInSection和cellForItem加载CollectionView

extension ProfileViewController: UICollectionViewDataSource,UICollectionViewDelegate {


    func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {

        return postsuser.count

    }

    func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
        let cell: PostsCollectionViewCell = collectionView.dequeueReusableCell(withReuseIdentifier: "postsCell", for: indexPath) as! PostsCollectionViewCell

        cell.set(post: postsuser[indexPath.row])

        return cell
    }

}

1 个答案:

答案 0 :(得分:0)

好吧,我的猜测-根据您的数据库结构-是您正在访问无效路径。 当您引用Database.database().reference().child("posts").child("author")时,是说posts有一个直接author的孩子,但事实并非如此,他们是post id的直接孩子,然后获取相应的post,您可以获得author,因此在这种情况下,您必须遍历所有帖子。

因此,要获取所有帖子:

let postsRef = Database.database().reference().child("posts")

然后您将有一个ID为键的帖子的对象非常重要 -这不是数组),那么您将遍历他们并获取您想要的相应作者。我不会详细介绍您的实现,而只是澄清我在说什么:

let specificPostAuthor = postsRef.child("LOj1UZZgUnKa28xVtht").child("author")

将返回各自的帖子作者