如何检查Google Firebase Firestore文档是否存在?(Swift实现)
检查Firebase Firestore文档是否存在的优化方案
Hey Andrew, 你的代码核心思路是正确的——通过文档引用调用getDocument来判断文档是否存在,但咱们可以补上一些安全处理和细节优化,让代码更健壮:
1. 修复可选值强制解包的风险
你的代码里用了UserName!强制解包UserNameText.text,如果输入框为空或者text为nil,会直接导致程序崩溃。建议用可选绑定+空白字符检查来安全处理:
guard let userName = UserNameText.text, !userName.trimmingCharacters(in: .whitespacesAndNewlines).isEmpty else { print("用户名不能为空或仅包含空白字符") return }
2. 补上错误处理逻辑
原代码没有处理请求失败的情况(比如网络异常、权限不足),这会导致你无法得知查询失败的原因。在闭包里优先处理错误:
userRef.getDocument { (document, error) in // 先处理查询错误 if let error = error { print("获取文档失败: \(error.localizedDescription)") return } // 再判断文档是否存在 if let document = document, document.exists { print("Document data: \(document.data() ?? [:])") } else { print("Document does not exist") } }
这里用document.data() ?? [:]替代String(describing:),让输出更整洁,避免打印Optional(nil)这类冗余信息。
3. 完整优化后的代码
结合以上两点,完整的健壮代码如下:
let db = Firestore.firestore() // 安全获取并验证用户名输入 guard let userName = UserNameText.text, !userName.trimmingCharacters(in: .whitespacesAndNewlines).isEmpty else { print("用户名不能为空或仅包含空白字符") return } // 生成用户文档引用(假设文档ID就是用户名) let userRef = db.collection("users").document(userName) // 查询文档并判断存在性 userRef.getDocument { (document, error) in // 处理查询错误 if let error = error { print("获取用户文档失败: \(error.localizedDescription)") return } // 判断文档是否存在 if let document = document, document.exists { let userData = document.data() ?? [:] print("找到用户文档,数据: \(userData)") } else { print("该用户名对应的文档不存在") } }
额外提示
- 命名规范:Swift变量名建议使用小驼峰(比如
userName而非UserName),符合语言习惯。 - 查询性能:如果你的文档ID就是用户名,直接通过
document(userName)查询是最高效的方式,比用whereField查询更快。 - 缓存策略:如果需要优先读取本地缓存,可以调用
getDocument(source: .cache),默认策略是先读缓存再同步服务器数据。
内容的提问来源于stack exchange,提问作者Andrew Wang
相关产品推荐
相关产品推荐

