Firebase - 按键数排序并在TableView中显示帖子。

问题描述 投票:0回答:1

我做了一个应用程序,可以用childByAutoID键把用户的信息和用户名保存到Firebase。里面有保存用户名、消息、喜欢和PostID的子程序(如下图所示)。

enter image description here

经过大量的研究和自己编写代码的尝试,我发现喜欢需要以autoID键的形式保存在单独的子程序中,然后你必须计算这些键来获得喜欢的数量(你会看到那个子程序也在下图中,那个子程序被命名为 "Liked")。

enter image description here

一切都显示在tableView单元格中.但所有的数据都是随机显示的,这是好的(我更喜欢按添加的日期排序),但真正想要的是在下一个VC中加载的数据显示为。

本周的前十名 本月的前十名 所有最好的等等...

当你按下这个按钮时,你会看到下一个VC,其中包含相同数据的表视图,但这次是按最喜欢的帖子排序。

这段代码是将按键写入LIKED子路径(当按下 "喜欢 "键时,已经从Firebase数据库中加载了数据)。

    @IBAction func likePressed(_ sender: Any) {

    let ref = Database.database().reference()
    self.likeButton.isEnabled = false
    let key = ref.child("Frusters").childByAutoId().key

    ref.child("Frusters").child(self.postID).observeSingleEvent(of: .value, with: { (snapshot) in

                let updateLikes = ["Liked/\(key)" : key] as [String : Any]
                    ref.child("Frusters").child(self.postID).updateChildValues(updateLikes, withCompletionBlock: { (error, reff) in

                        if error == nil {
                            ref.child("Frusters").child(self.postID).observeSingleEvent(of: .value, with: { (snap) in
                        if let properties = snap.value as? [String : AnyObject] {
                        if let likes = properties["Liked"] as? [String : AnyObject] {

                        let count = likes.count
                        self.likeLabel.text = "\(count) Likes"

                        let update = ["likes" : count]
                        ref.child("Frusters").child(self.postID).updateChildValues(update)

                        self.likeButton.isHidden = true
                        self.unlikeButton.isHidden = false
                        self.likeButton.isEnabled = true
                        }
                    }
                })
            }
        })
    })

    ref.removeAllObservers()
}

这是加载数据并放入我的表视图的代码

    func loadData() {
    self.fetchPosts.removeAll()
    let ref = Database.database().reference()
    ref.child("Frusters").observeSingleEvent(of: .value, with: { (snapshot) in
        if let postDict = snapshot.value as? [String:AnyObject] {
            for (_,postElement) in postDict {
                print(postElement);
                let post = Post()
                post.username = postElement["Username"] as? String
                post.message = postElement["Message"] as? String
                post.likes = postElement["likes"] as? Int
                post.postID = postElement["postID"] as? String
                self.fetchPosts.append(post)
            }
        }
        self.tableView.reloadData()

    }) { (error) in
        print(error.localizedDescription)
    }
    ref.removeAllObservers()
}

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return self.fetchPosts.count
}

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: "Cell")  as! PostTableViewCell

    cell.messageLabel.text = self.fetchPosts[indexPath.row].message
    cell.usernameLabel.text = self.fetchPosts[indexPath.row].username

    cell.likeLabel.text = "\(self.fetchPosts[indexPath.row].likes!) Likes"
    cell.postID = self.fetchPosts[indexPath.row].postID

    cell.bckgView.layer.cornerRadius = 0

    cell.bckgView.layer.shadowOffset = CGSize(width: 0, height: 1)
    cell.bckgView.layer.masksToBounds = false
    cell.bckgView.layer.shadowColor = UIColor.black.cgColor
    cell.bckgView.layer.shadowOpacity = 0.3
    cell.bckgView.layer.shadowRadius = 4

    return cell
}

func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
    return UITableViewAutomaticDimension;
}

好吧,问题是我不知道如何在我的新UITableView中插入最喜欢的前10个帖子,将它们从最喜欢的帖子排序到接下来最喜欢的9个。

另外,是否可以将本月或本周最喜欢的帖子进行排序?Firebase数据库(autoID)的这个键是否包含创建帖子的日期,或者我必须在里面插入新的日期子代,然后在代码中结合 "日期 "子代和 "喜欢 "子代,以显示本月1日和上月的前10个喜欢的帖子?

先谢谢你了。)

ios uitableview firebase swift3 firebase-realtime-database
1个回答
0
投票

1-如果你只关心数字的话,你不需要单独存储每个赞。您可以只更新数字。

    @IBAction func likePressed(_ sender: Any) {

    let ref = Database.database().reference()
    self.likeButton.isEnabled = false
    let key = ref.child("Frusters").childByAutoId().key

    ref.child("Frusters").child(self.postID).observeSingleEvent(of: .value, with: { (snapshot) in

    let counted = snapshot.value as? Int
    self.ref.child("Flusters".child(self.postID).child("likes").setValue(counted! + 1)
})

2-是的,你可以按赞数排序,你需要使用.queryOrdered函数。你需要使用.queryOrdered函数,更新代码如下

func loadData() {
    self.fetchPosts.removeAll()
    let ref = Database.database().reference()
    ref.child("Frusters").queryOrdered(byChild: "likes").observeSingleEvent(of: .value, with: { (snapshot) in
        if let postDict = snapshot.value as? [String:AnyObject] {
            for (_,postElement) in postDict {
                print(postElement);
                let post = Post()
                post.username = postElement["Username"] as? String
                post.message = postElement["Message"] as? String
                post.likes = postElement["likes"] as? Int
                post.postID = postElement["postID"] as? String
                self.fetchPosts.append(post)
            }
        }
        self.tableView.reloadData()

3-如果要按前一周、一个月来排序,你得记下一个时间戳。

© www.soinside.com 2019 - 2024. All rights reserved.