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

如何获取Cloud Firestore当前已登录用户数据并展示在UILabel上

你当前的代码逻辑整体正确,运行后不展示用户名的核心原因是Firestore 数据库回调默认运行在后台线程,所有 UI 相关操作必须切换到主线程执行,除此之外还可以对代码做几处安全性优化。

修正后的完整代码

1. 优化用户名获取方法

func getName(completion: @escaping (String) -> Void) {
    // 避免强制解包当前用户,未登录状态直接返回提示
    guard let uid = Auth.auth().currentUser?.uid else {
        completion("未登录")
        return
    }
    let docReference = db.collection("users").document(uid)
    docReference.getDocument { snapshot, error in
        if let error = error {
            print("获取用户信息失败:\(error.localizedDescription)")
            completion("加载失败")
            return
        }
        guard let snapshot = snapshot, snapshot.exists,
              let data = snapshot.data(),
              let firstName = data["FirstName"] as? String else {
            completion("未设置昵称")
            return
        }
        completion(firstName)
    }
}

2. 主线程更新 UI 的调用代码

override func viewDidLoad() {
    super.viewDidLoad()
    getName { [weak self] name in
        // 切换到主队列执行UI更新
        DispatchQueue.main.async {
            self?.fullName.text = name
        }
    }
}

关键优化说明

  • 避免强制解包:删除了对当前用户currentUser的强制解包!,防止用户未登录状态下触发闪退
  • 内存安全:使用[weak self]避免闭包强持有页面实例引发内存泄漏
  • 错误提示细化:针对不同错误场景返回不同的提示文案,方便排查问题
  • 命名规范:符合 Swift 小驼峰命名规则,修正了参数名、变量名的拼写和格式问题

异常排查

如果修改后仍然无法正常展示用户名,可按以下顺序排查:

  • 确认 Firestore 权限规则允许用户读取自己的用户文档,参考规则配置:
rules_version = '2';
service cloud.firestore {
  match /databases/{database}/documents {
    match /users/{userId} {
      allow read, write: if request.auth != null && request.auth.uid == userId;
    }
  }
}
  • 确认数据库users集合下的文档ID和当前登录用户的uid完全一致,FirstName字段名的大小写和代码中完全匹配(Firestore 字段名大小写敏感)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 19:27:03