Firebase SwiftUI 和 Firebase Auth - 不读取用户 ID?

Posted

技术标签:

【中文标题】Firebase SwiftUI 和 Firebase Auth - 不读取用户 ID?【英文标题】:Firebase SwiftUI and Firebase Auth - not reading user ID? 【发布时间】:2020-06-08 21:16:37 【问题描述】:

下面是我的注册页面的代码。我想这样做,以便当有人在注册页面上创建帐户时,我在用户集合中创建一个文档并将 uuid 包含在文档中。但是, session.session?.uid 最终为零。有谁知道这是为什么?

struct SignUpView: View 
    @State var email = ""
    @State var password = ""
    @State var name = ""
    @State var error = ""
    @EnvironmentObject var session: SessionStore

    func signUp() 
        let db = Firestore.firestore()
        let user = db.collection("users").document()
        let test = db.collection("users").document(user.documentID).collection("routines").document()
        session.signUp(email: email, password: password)  (result, error) in
            if let error = error 
                self.error = error.localizedDescription
                print("This is the error \(error)")
                return
             else 
                self.email = ""
                self.password = ""
            
        

        user.setData(["id": user.documentID, "email": email])  (err) in
            if err != nil 
                print((err?.localizedDescription)!)
                return
            
        
        print(session.session?.uid)
        test.setData(["id:": test.documentID, "msg": "samwell Tarly", "uuid": session.session?.uid])  (err) in
            print("ummmmm test data?")
            if err != nil 
                print((err?.localizedDescription)!)
                return
            
        
    

【问题讨论】:

嗨@David - 请提供更多详细信息/上下文。我们需要知道SessionStore 的样子才能回答您的问题。 【参考方案1】:

Firebase API 是异步的,因为它们通过互联网访问远程系统,这需要一点时间。顺便说一句,这同样适用于访问本地磁盘。这个blog post 更详细地解释了这一点。

因此,session.signUp 是一个异步进程。 IE。对print(session.session?.uid) 的调用在session.signUp 返回之前执行。因此,session.session?.uid 仍然是 nil

要解决这个问题,您可以像这样嵌套调用:

session.signUp(email: email, password: password)  (result, error) in
  if let error = error 
    self.error = error.localizedDescription
    print("This is the error \(error)")
    return
   
  else 
    self.email = ""
    self.password = ""

    user.setData(["id": user.documentID, "email": email])  (err) in
      if err != nil 
        print((err?.localizedDescription)!)
        return
      
    
  

一般来说,我会强烈建议不要在你的视图中执行太多逻辑,而是尽可能让你的视图保持贫乏 - 意思是:将所有逻辑放入视图模型中,并绑定使用组合查看视图模型。这将使您的代码更简洁、更易于测试和可维护。

请参阅https://peterfriese.dev/replicating-reminder-swiftui-firebase-part2/ 了解如何执行此操作。

【讨论】:

谢谢彼得!认为这可能是一个异步问题,但不知道如何解决它。

以上是关于Firebase SwiftUI 和 Firebase Auth - 不读取用户 ID?的主要内容,如果未能解决你的问题,请参考以下文章

我该如何解决这个问题:Android Studio - Flutter - Dart - firebase [关闭]

SwiftUI 和 Firebase:如何删除用户?

SwiftUI 和 Firebase:当前用户是不是持续存在?

SwiftUI / Firebase:我可以使用@Published 向 Firebase 数据库发送和接收单个值吗?

SwiftUI 和 Firebase:从推送通知中获取信息

使用 Firebase 的 Swiftui 中未显示数据