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
相关产品推荐
相关产品推荐

