ios - Firebase 监听喜欢数量的变化并将其显示在屏幕上
问题描述
当用户双击图片时,每个帖子的点赞数(心)都会增加。我试过这段代码,但它没有按预期工作(例如,当我双击时,它会加载一个帖子并用不同数量的喜欢复制它(例如帖子 1-1like、Post 1-2like、Post 1-3like)。如何在不复制帖子的情况下显示更新的点赞数?(帖子 1- 显示 X=Incremental 的点赞数)
func loadPosts() {
let ref = Database.database().reference()
ref.child("posts").observe(.childAdded) { (snapshot: DataSnapshot) in
if let dict = snapshot.value as? [String: Any] {
guard let titleText = dict["title"] as? String else{return}
let locationDetails = dict["location"] as! String
let captionText = dict["caption"] as! String
let photoUrlString = dict["photoUrl"] as! String
let priceText = dict["price"] as! String
let categoryText = dict["category"] as! String
let usernameLabel = dict["username"] as! String
let profileImageURL = dict["pic"] as! String
let heartInt = dict["heart"] as! Int
let timestampString = dict["timestamp"] as! String
let post = Post(titleText: titleText, captionText: captionText, locationDetails: locationDetails, photoUrlString: photoUrlString, priceText: priceText,categoryText: categoryText, usernameLabel: usernameLabel, profileImageURL: profileImageURL, heartInt: heartInt, timestampString: timestampString)
//append(post) to array
self.posts.append(post)
print(self.posts)
self.collectionView.reloadData()
}
}
}
func delayCompletionHandler(completion:@escaping (() -> ())) {
let delayInSeconds = 0.5
DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + delayInSeconds) {
completion()
}
}
//CollectionView
func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell{
cell.reloadEvents = {
self.delayCompletionHandler {
self.loadPosts()
}
}
}
要检测另一个文件中的 heartTapped:
@objc func heartTapped(){
print(" I heart u")
let ref = Database.database().reference()
heartInt1 += 1
ref.child("posts").child(timestamp).observeSingleEvent(of: .value, with: { (snapshot) in
if let dic = snapshot.value as? [String : AnyObject]{
var heartString = dic["heart"] as! Int
heartString += 1
ref.child("posts").child(self.timestamp).updateChildValues(["heart" : heartString])
}
})
reloadEvents?()
}
}
解决方案
您的解决方案是不好的做法。当您处理数据库时,您必须进行大规模思考,如果金卡戴珊每秒获得一颗心使用您的应用程序,那么会发生什么,为每颗心加载和删除所有内容?这听起来有效率吗?
您需要找到一种仅加载红心数量而不是所有内容的方法才能获得红心数量。
一个解决方案是添加一个额外的孩子ref.child("hearts")
,然后有一个loadHearts()
你会得到心数的地方。
推荐阅读
- javascript - 将 div 插入每个细节项 | javascript
- java - 为什么我从下面的代码中收到错误 java.util.NoSuchElementException?
- python - Qt 调试器在 mac 上使用错误的 python 版本
- javascript - 如何在 Duktape 中使用 typescript 模块
- amazon-web-services - 是否可以在没有注册域名的情况下托管一个安全的静态网站?
- c++ - 如何创建一个在文本中找到匹配单词的函数,包括跳过
- gulp - gulpfile 错误 AssertionError [ERR_ASSERTION]: 必须指定任务函数
- spring-boot - 创建名为“rabbitTemplate”的 bean 时出错 - 使用 Spring Boot 的 CloudAMQP
- sql - 在一个公共列上连接三个表
- vue.js - Vue Cli 应用程序在部署到 heroku 时失败“错误:无法解析 vue-axios”