如何获取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
相关产品推荐
相关产品推荐

