Firebase更新Post点赞数时数据写入错误节点问题求助
你的代码核心问题是postRef指向的是所有帖子的根路径/posts,并非你要操作的单条特定帖子节点,所以调用updateChildValues时会直接在/posts下新增likes字段,而非写入对应帖子的子节点中。同时你当前直接监听整个posts节点数据的写法会拉取全量帖子数据,存在严重的性能浪费。
修复方案
你需要先持有当前要操作的帖子ID(一般从帖子列表跳转至当前页时传入),将引用指向具体的单条帖子节点即可。同时推荐使用Firebase事务处理点赞计数,避免多用户同时点赞时出现数据冲突:
// 当前控制器需提前持有要操作的帖子ID,由列表页跳转时传入即可 var currentPostId: String! // 调整引用指向具体的单条帖子节点 var postRef: DatabaseReference { return Database.database().reference().child("posts").child(currentPostId) } @IBAction func LikePostTapped(_ sender: UIButton) { // 用事务处理点赞数,保证并发操作时数据准确 postRef.runTransactionBlock({ (currentData) -> TransactionResult in if var post = currentData.value as? [String : AnyObject], let likes = post["likes"] as? Int { post["likes"] = likes + 1 as AnyObject currentData.value = post return TransactionResult.success(withValue: currentData) } // 帖子还没有点赞数时初始化为1 currentData.value = ["likes": 1] return TransactionResult.success(withValue: currentData) }) { [weak self] error, committed, snapshot in guard let self = self, error == nil, committed, let snapshot = snapshot else { return } if let postData = snapshot.value as? [String: Any], let count = postData["likes"] as? Int { DispatchQueue.main.async { self.LikeCount.text = "\(count)" self.LikeCount.textColor = .red } } } }
内容的提问来源于stack exchange,提问作者CodingForFun333
相关产品推荐
相关产品推荐

