【问题标题】:Firebase SwiftUI and Firebase Auth - not reading user ID?Firebase SwiftUI 和 Firebase Auth - 不读取用户 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 的样子才能回答您的问题。

标签: firebase firebase-authentication swiftui


【解决方案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/ 了解如何执行此操作。

【讨论】:

  • 谢谢彼得!认为这可能是一个异步问题,但不知道如何解决它。
猜你喜欢
  • 2017-12-14
  • 1970-01-01
  • 2018-09-24
  • 2020-11-14
  • 1970-01-01
  • 2023-03-19
  • 1970-01-01
  • 2018-05-31
  • 1970-01-01
相关资源
最近更新 更多