SwiftUI: почему наблюдаемый объект инициализируется в момент возникновения awsTask? - PullRequest
0 голосов
/ 21 февраля 2020

Я подаю заявку, требуется 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()
                }
            })
        })
    }

Я хочу знать, почему наблюдаемая Объект был инициализирован и как это предотвратить.

...