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

Swift读取Firestore评论数据失败问题排查请求

Firebase评论动态读取失败原因排查

1. 读取路径与写入路径完全不匹配

写入数据时,路径基于传入的order.title和order.userID构建:

usersRefStartsReview.document(order.title).collection(order.userID).document(order.id)

实际Firestore存储路径为 Starts_Review/{目标title}/{用户ID}/{评论ID}。

但读取时错误使用了内部定义的空title实例ViewModelNewReg:

private var ViewModelNewReg: Starts_review {
    return Starts_review(id: "", userID: AuthService.shared.currentUser!.uid, date: Date(), starts_review: 0, review: "", title: "", city: "")
}

导致读取路径变成 Starts_Review/空字符串/{当前用户ID},完全偏离数据实际存储位置,自然读不到动态写入的数据。静态读取能成功是因为手动指定了正确的路径参数。

2. 初始化参数未被有效利用

getDataReviewStarts初始化时接收了reviewStarts参数,但读取Firestore时完全忽略该参数,未用它的title构建正确路径,反而使用无意义的空默认值。

3. 强制解包存在崩溃风险

代码中直接用AuthService.shared.currentUser!.uid强制解包,若用户未登录会直接触发崩溃,需替换为可选绑定处理。


修复后的读取类代码示例

import SwiftUI
import Firebase

class getDataReviewStarts : ObservableObject{
    @Published var datasReview = [Starts_review]()
    @Published var reviewStarts: Starts_review

    init(reviewStarts: Starts_review) {
        self.reviewStarts = reviewStarts
        
        // 先验证用户登录状态
        guard let userID = AuthService.shared.currentUser?.uid else {
            print("用户未登录,无法读取评论")
            return
        }
        
        let db = Firestore.firestore()
        // 使用初始化传入的reviewStarts.title构建正确路径
        db.collection("Starts_Review")
          .document(reviewStarts.title)
          .collection(userID)
          .getDocuments { (snap, err) in
            if let err = err {
                print(err.localizedDescription)
                return
            }
            guard let documents = snap?.documents else {
                print("未找到评论文档")
                return
            }
            
            for doc in documents {
                // 安全解析文档字段,避免强制解包崩溃
                guard let titleReview = doc.get("nameStart") as? String,
                      let cityReview = doc.get("StartCity") as? String,
                      let starts_review_Review = doc.get("starts_review") as? Int,
                      let review_Review = doc.get("review") as? String,
                      let timestamp = doc.get("date") as? Timestamp else {
                    print("评论文档字段解析失败")
                    continue
                }
                
                let date = timestamp.dateValue()
                self.datasReview.append(Starts_review(
                    id: doc.documentID,
                    userID: userID,
                    date: date,
                    starts_review: starts_review_Review,
                    review: review_Review,
                    title: titleReview,
                    city: cityReview
                ))
            }
        }
    }
}

额外优化建议

给Starts_review添加从Firestore文档初始化的扩展,简化字段解析逻辑:

extension Starts_review {
    init?(document: DocumentSnapshot) {
        guard let data = document.data(),
              let userID = data["userID"] as? String,
              let timestamp = data["date"] as? Timestamp,
              let starts_review = data["starts_review"] as? Int,
              let review = data["review"] as? String,
              let title = data["nameStart"] as? String,
              let city = data["StartCity"] as? String else {
            return nil
        }
        
        self.id = document.documentID
        self.userID = userID
        self.date = timestamp.dateValue()
        self.starts_review = starts_review
        self.review = review
        self.title = title
        self.city = city
    }
}

之后读取时可简化为:

for doc in documents {
    if let review = Starts_review(document: doc) {
        self.datasReview.append(review)
    }
}

内容的提问来源于stack exchange,提问作者Homyk

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 05:17:30