我已经制作了应用程序,使用childByAutoID密钥将用户消息及其用户名保存到Firebase。里面有孩子可以保存用户名,消息,喜欢和PostID(如下图所示)。
经过大量研究和大量尝试自己编写代码后,我发现喜欢需要在单独的子项中保存为autoID键,然后你必须计算这些键以获得喜欢的数量(你会看到那个孩子也在下面的图像上,那个孩子被命名为“Liked”)
所有内容都显示在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名之间的帖子本月的第一天和最后一天?
提前致谢。 ;)
答案 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-要按星期,月份的顺序进行订购,您必须跟踪时间戳。