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

时间:2017-08-20 18:31:23

标签: ios uitableview firebase swift3 firebase-realtime-database

我已经制作了应用程序,使用childByAutoID密钥将用户消息及其用户名保存到Firebase。里面有孩子可以保存用户名,消息,喜欢和Po​​stID(如下图所示)。

enter image description here

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

enter image description here

所有内容都显示在tableView单元格中。 但是所有这些都是随机显示的(我希望按照添加的日期排序),但是真正喜欢的是下一个VC中加载的数据显示为:

本周前十名 本月前十名 所有最佳等...

菜单上会有单独的按钮,按下它时,您将看到包含具有相同数据的表视图的下一个VC,但这次按照最喜欢的帖子排序。

这是将密钥写入LIKED子路径的代码(当按下来自Firebase数据库的已加载数据时):

module Pattern where

import Lang


optimize :: Program -> Program
optimize p
  | p' <- reorder $ rewrite $ moveSkip p
  , p /= p'   = optimize p'
  | otherwise = p

rewrite :: Program -> Program
rewrite (Move a : Move b : x) = rewrite $ Move (a+b) : x
rewrite (Add  a : Add  b : x) = rewrite $ Add  (a+b) : x
rewrite (Move 0          : x) = rewrite x
rewrite (Add  0          : x) = rewrite x
rewrite (Skip   : Skip   : x) = rewrite x
rewrite (Halt            : _) = [Halt]
rewrite (Skip : x : xs) = Skip : x : rewrite xs
rewrite (x : xs)        = x : rewrite xs
rewrite []              = []

moveSkip :: Program -> Program
moveSkip (Skip : a : x) = x ++ [Skip, a]
moveSkip x = x

reorder :: Program -> Program
reorder (Move x : xs)
  | (no_skips  , Move y : xs') <- break isMove xs
  , (no_skips' , Move w :  q ) <- break isMove xs'
  , x == -y
  , all (/=Skip) no_skips
  , all (/=Skip) no_skips'
  = Move x : no_skips ++ no_skips' ++ Move (w-x) : reorder q
  | otherwise  = Move x : reorder xs
reorder (Skip : x : xs) = Skip : x : reorder xs
reorder (x:xs) = x : reorder xs
reorder []     = []

isMove (Move _) = True
isMove _        = False

这是加载数据并将其放在我的表视图中的代码:

    @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()
}

嗯,问题是我不知道如何插入我最喜欢的新UITableView前十篇文章中,将它们从最喜欢的帖子排序到最喜欢的帖子到其中的9个。

此外,是否有可能对本月或本周最喜欢的人进行排序? 这个Firebase数据库生成的密钥(通过autoID)是否包含创建帖子的日期,或者我必须在内部插入带有日期的新子项,然后在代码中将“date”子项和“已喜欢”子项组合在一起显示为前10名之间的帖子本月的第一天和最后一天?

提前致谢。 ;)

1 个答案:

答案 0 :(得分: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函数。更新代码如下

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-要按星期,月份的顺序进行订购,您必须跟踪时间戳。