Я подаю заявку, требуется Aws Cognito
войти или зарегистрироваться.
На SignIn view
, который имеет два текстовых поля, одно для электронной почты, другое для пароля.
User
, объект среды, имеет пользовательские атрибуты и функции для аутентификации Aws Cognito
.
Вот мой User environment object
.
class User: NSObject, ObservableObject {
@Published var email: String = ""
@Published var password: String = ""
}
На SignInView
существует два объекты для проверки.
struct SignInView: View {
@EnvironmentObject var user: User
@ObservedObject var input = SignInViewModel()
var body: some View {
NavigationView {
ZStack{
Color(R.color.primaryBlue()!)
.edgesIgnoringSafeArea(.all)
VStack {
VStack(alignment: .leading, spacing: 8) {
TextField("Main address", text: self.$input.email)
SecureField("Password", text: self.$input.password)
Button(action: {
if self.input.isAllInputValided {
self.asyncSignIn()
}
}) {
Text("Sign in")
}
}
}
}
}
}
func asyncSignIn(){
self.user.email = self.input.email
self.user.password = self.input.password
self.user.signIn(email: self.user.email, password: self.user.password).then { _ in
//pass
}.catch { _ in
// the method for error
}
}
}
User environment object
предназначен для хранения пользовательских атрибутов или обеспечения методов проверки подлинности для Aws Cognito
и SignInViewModel
для проверки. Если быть точным, SignInViewModel
также имеет переменные адреса электронной почты и пароля и на didSet
проверяет ввод, в то время как переменные постоянно изменяются.
Итак, SignInViewModel
'* email
и password
привязаны к текстовым полям; и, нажимая кнопку SignIn
, SignInViewModel
передают значения переменных в User environment object
.
Когда я ввел электронную почту и пароль, а также pu sh, кнопку Sign in
, User environment object
и asyncSignIn()
вызывается и выполняется с использованием переменных.
asyncSignIn()
вызывает функцию User environment object
signIn()
и начинает получать аутентификацию с использованием Aws Cognito
API, self.userPool.getUser(email).getSession(email, password: password, validationData: nil)
.
Пока здесь текстовые поля не имеют значения переменной SignInViewModel
. Но после self.userPool.getUser(email).getSession(email, password: password, validationData: nil)
makess AwsTask
, SignInViewModel
инициализируется и, конечно, текстовое поле пусто.
Вот функция signIn
.
func signIn(email: String, password: String) -> Promise<Bool> {
return Promise<Bool> (in: .background, { resolve, reject, _ in
self.userPool.getUser(email).getSession(email, password: password, validationData: nil).continueWith(block: {task -> Void in
if let error = task.error as NSError? { <<<<< SignInViewModel is initialized and the textfield is being empty here
//
// Sign in Failed
//
let errorType = error.userInfo["__type"] as? String
print(errorType!)
DispatchQueue.main.async {
self.errorHandler(errorType: errorType!)
reject(error)
}
return
}
// Signed In
DispatchQueue.main.async {
self.email = email
let authDetails = AWSCognitoIdentityPasswordAuthenticationDetails(username: email, password: password)
self.passwordAuthenticationCompletion?.set(result: authDetails)
self.userErrorState = .succeed
self.refresh()
}
})
})
}
Я хочу знать, почему наблюдаемая Объект был инициализирован и как это предотвратить.