set*_*eee 2 firebase swift firebase-authentication swiftui
我打电话Authenticator.loginUser()时期望该方法将登录用户然后调用getCurrentUser(). 基于打印输出,getCurrentUser()首先执行。有没有办法强制它按顺序执行?
class Authenticator: ObservableObject {
@Published var currentUser: UserProfile = UserProfile()
@Published var user: String = ""
@Published var documentId: String = ""
func loginUser (email: String, password: String, viewModel: UsersViewModel) {
FirebaseAuth.Auth.auth().signIn(withEmail: email, password: password, completion: { result, error in
guard error == nil else {
print ("error: \(error!)")
return
}
print ("user signed in")
})
self.user = self.getCurrentUser(viewModel: viewModel)
}
func getCurrentUser(viewModel: UsersViewModel) -> String {
guard let userID = Auth.auth().currentUser?.uid else {
return ""
}
viewModel.users.forEach { i in
if (i.userId == userID) {
currentUser = i
}
}
documentId = currentUser.documentId!
print("auth.documentId \(documentId)")
return userID
}
}
Run Code Online (Sandbox Code Playgroud)
FirebaseAuth.Auth.auth().signIn是异步的- 它在后台运行,而不是在主线程上。这意味着signIn将在未来的某个时间调用。
一种解决方案是将调用getCurrentUser放在完成块中:
func loginUser(email: String, password: String, viewModel: UsersViewModel) {
FirebaseAuth.Auth.auth().signIn(withEmail: email, password: password, completion: { result, error in
guard error == nil else {
print("error: \(error!)")
return
}
print("user signed in")
self.user = self.getCurrentUser(viewModel: viewModel) // move here
})
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
69 次 |
| 最近记录: |