【发布时间】:2020-07-03 20:57:54
【问题描述】:
在 updatePassword 函数之外触发时,segue 可以正常工作。
完全错误 -
'2020-07-03 13:17:34.656198+0100 FindingTaylorSwift[5305:154832] pushViewController:animated: 在发生现有转换或演示时调用
@IBAction func updatePasword(_ sender: UIButton) {
.....
_ = self.awsUserPoolUpdatePassword.updatePasswordWithConfirmationCodeError?
.subscribe({ errorText in
guard let elementContent = errorText.element?.localizedDescription else { return }
switch elementContent {
case "The operation couldn’t be completed. (AWSMobileClient.AWSMobileClientError error 2.)":
self.showAlert(title: UpdatePasswordError.titleCode, message: UpdatePasswordError.messageCode)
case "The operation couldn’t be completed. (AWSMobileClient.AWSMobileClientError error 8.)":
self.showAlert(title: UpdatePasswordError.titlePassword, message: UpdatePasswordError.messagePasswordShort)
case "The operation couldn’t be completed. (AWSMobileClient.AWSMobileClientError error 9.)":
self.showAlert(title: UpdatePasswordError.titlePassword, message: UpdatePasswordError.messagePasswordComplexity)
default:
self.showAlert(title: UpdatePasswordError.titleDefault, message: UpdatePasswordError.messageDefault)
}
})
_ = self.awsUserPoolUpdatePassword.updatePasswordWithConfirmationCodeResult?
.subscribe({ resultText in
guard let elementContent = resultText.element?.forgotPasswordState else { return }
switch elementContent {
case .done:
self.showAlert(title: PasswordUpated.title, message: "")
self.transitionToLogin()
default:
self.showAlert(title: UpdatePasswordError.titleDefault, message: UpdatePasswordError.messageDefault)
}
})
}
private func transitionToLogin() {
DispatchQueue.main.asyncAfter(deadline: .now() + 0.5) {
self.performSegue(withIdentifier: AWSControllers.awsUpdatedPasswordSuccess, sender: self)
}
// DispatchQueue.main.async {
// self.performSegue(withIdentifier: AWSControllers.awsUpdatedPasswordSuccess, sender: self)
// }
}
AWS 类
internal func updatePasswordWithConfirmationCode(newPassword: String, confirmationCode: String) {
guard let username = self.awsUserNameEmail else { return }
let result = AWSMobileClient.default().rx.confirmForgotPassword(username: username, newPassword: newPassword, confirmationCode: confirmationCode)
.materialize()
result
.compactMap { $0.element }
.subscribe(onNext: { forgotPasswordResult in
switch forgotPasswordResult.forgotPasswordState {
case .done:
print("Password changed successfully")
self.userPasswordUpdateStatus = .passwordUpdateSuccessful
default:
print("Error: Could not change password.")
}
})
.disposed(by: disposeBag)
updatePasswordWithConfirmationCodeError = result.compactMap { $0.error }
updatePasswordWithConfirmationCodeResult = result.compactMap { $0.element }
}
}
extension Reactive where Base: AWSMobileClient {
func signIn(username: String, password: String) -> Observable<SignInResult> {
return Observable.create { observer in
self.base.signIn(username: username, password: password) { (signinResult, error) in
if let signinResult = signinResult {
observer.onNext(signinResult)
observer.onCompleted()
} else {
observer.onError(error ?? RxError.unknown)
}
}
return Disposables.create()
}
}
func confirmForgotPassword(username: String, newPassword: String, confirmationCode: String) -> Observable<ForgotPasswordResult> {
return Observable.create { observer in
self.base.confirmForgotPassword(username: username, newPassword: newPassword, confirmationCode: confirmationCode) { (confirmForgotPasswordResult, error) in
if let confirmForgotPasswordResult = confirmForgotPasswordResult {
observer.onNext(confirmForgotPasswordResult)
observer.onCompleted()
} else {
observer.onError(error ?? RxError.unknown)
}
}
return Disposables.create()
}
}
}
segue 只能在密码更新成功后触发,密码更新成功由 print 语句确认。
【问题讨论】: