我做了一个应用程序,可以用childByAutoID键把用户的信息和用户名保存到Firebase。里面有保存用户名、消息、喜欢和PostID的子程序(如下图所示)。
经过大量的研究和自己编写代码的尝试,我发现喜欢需要以autoID键的形式保存在单独的子程序中,然后你必须计算这些键来获得喜欢的数量(你会看到那个子程序也在下图中,那个子程序被命名为 "Liked")。
一切都显示在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个喜欢的帖子?
先谢谢你了。)
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-如果要按前一周、一个月来排序,你得记下一个时间戳。