You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.18 09:24:09