iOS接入Firebase实现拉黑功能时查询拉黑列表文档不存在如何解决
问题原因及修复方案
常见排查方向
- 路径参数不匹配:Firestore 文档ID大小写敏感,且要求字符串完全匹配,写入时的用户名、查询时传入的用户名、UserDefaults存储的当前用户名字符串三者只要存在大小写差异、前后空格、字符差异,都会导致查询路径和实际存储路径不一致,无法命中文档。你可以在查询函数开头打印当前查询的完整路径,和Firestore控制台的存储路径逐一比对确认。
- 安全规则限制:如果你只开放了blocked集合的写入权限,未开放读权限的情况下,Firestore查询会默认返回文档不存在。你可以先在查询回调中新增错误打印,确认是否有权限类报错:
if let error = error { print("查询错误:\(error.localizedDescription)") return }
对应的安全规则参考配置如下:
rules_version = '2'; service cloud.firestore { match /databases/{database}/documents { match /users/{currentUser}/blocked/{blockedUser} { allow read, write: if request.auth != null && currentUser == request.auth.token.username; } } }
- 异步逻辑时序问题:你当前用全局变量存储拉黑状态,若在调用查询函数后立刻读取该变量,此时异步查询还未返回结果,拿到的是初始值false,也会导致逻辑异常,建议改为闭包回调获取查询结果。
优化后的代码示例
// 查询方法改为带闭包回调 public func IsBlockedByUser(username: String, completion: @escaping (Bool) -> Void) { guard let currentUser = UserDefaults.standard.string(forKey: "username") else { completion(false) return } let ref = database.collection("users") .document(currentUser) .collection("blocked") .document(username) ref.getDocument { (document, error) in if let error = error { print("查询失败:\(error)") completion(false) return } completion(document?.exists ?? false) } } // 调用示例,拿到结果后再更新UI IsBlockedByUser(username: 目标用户用户名) { [weak self] isBlocked in DispatchQueue.main.async { if isBlocked { // 展示拉黑提示 } else { // 加载正常个人主页信息 } } }
内容的提问来源于stack exchange,提问作者Christopher Mathews
相关产品推荐
相关产品推荐

