【问题标题】:Wait before calling a function in Swift在 Swift 中调用函数之前等待
【发布时间】:2020-10-25 22:31:58
【问题描述】:

我在我的 iOS 应用项目中使用 Firestore,我想向用户添加一些额外的数据,所以我创建了一个名为“配置文件”的集合,我希望每个文档都命名为 Auth.auth().currentUser.uid,所以我以后可以为每个用户检索数据(或者有更好的方法吗?)。

Firestore 中的这些文档是在用户注册新帐户时创建的:

func createUser() {
    db.collection("profiles").document("\(currentUser?.uid)").setData([
        "name": name,
        "surname": surname,
        "email": email,
        "shelter": isMember == true ? shelters[selectedShelter] : shelters[0],
        "photoURL": imageURL ?? "",
        "reputation": 0,
        "uuid": "\(uuid)"
    ])
    { err in
        if let error = err {
            print("Error ading document: \(error)")
        } else {
            print("Document added")
        }
    }
}

但是,此时调用此函数(单击“注册”按钮时)currentUser 不存在,因为它被定义为Auth.auth().currentUser,所以@ 987654327@ = nil 在 Firestore 中的“个人资料”文档中。

函数 createUser 在我的 Register 函数中被调用:

func register() {
    if self.email != ""  {
        if self.pass == self.repass {
            Auth.auth().createUser(withEmail: self.email, password: self.pass) { (res, err) in
                if err != nil {
                    self.error = err!.localizedDescription
                    self.alert.toggle()
                    return
                }
                // Success registering a new user
                viewRouter.currentView = "Home"
                DispatchQueue.main.async {
                    self.createUser()
                }
            }
        }
        else {
            self.error = "Les mots de passe ne correspondent pas"
            self.alert.toggle()
        }
    }
    else {
        self.error = "Veuillez remplir tous les champs"
        self.alert.toggle()
    }
}

我想过在调用 createUser 函数之前等待 Auth.auth().currentUser 存在。我尝试使用DispatchQueue.main.async 没有成功。

有什么想法吗?或者也许是实现我的目标的更好方法 - 即为每个用户添加更多数据(例如:声誉、庇护所......)?

感谢您的帮助!

【问题讨论】:

  • 对不起,我误解了自己,我想要的是在 Auth.auth().currentUser 存在之后调用 createUser,而不是在调用 createUser 之后调用。我已经更新了主帖。
  • 那么,您的代码看起来很棒。您在Auth.auth().createUser 的完成处理程序中调用self.createUser
  • 删除DispatchQueue.main.async {,因为它不需要。除此之外,您的代码很好。创建 Firebase 用户后,它会自动登录,您可以直接在该函数中或在 self.createUser() 中访问该用户对象,所以......有什么问题?见access user info。哦,this question 也有很好的答案。

标签: ios swift firebase google-cloud-firestore firebase-authentication


【解决方案1】:

您所做的是正确的,您实际上可以在完成处理程序中使用res 参数获取新创建的用户。

例子

Auth.auth().createUser(withEmail: self.email, password: self.pass) { (res, err) in
    if err != nil {
        self.error = err!.localizedDescription
        self.alert.toggle()
        return
    }

    // Successfully registered a new user, get the user id
    guard let currUserId = res?.user.uid else { return }

    // ...

    // Maybe add uid as a parameter of createUser
    createUser(id: currUserId)
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-18
    • 2018-05-28
    • 2020-05-01
    • 2021-12-25
    • 2016-07-29
    • 2016-09-26
    相关资源
    最近更新 更多