我正在遵循docs以通过API实现登录,
class AWSUserPool {
var userAuthenticationError: Error?
AWSMobileClient.default().signIn(username: <param username>, password: <param password>) { (signInResult, error) in
if let error = error {
print("\(error.localizedDescription)")
self.userAuthenticationError = error
} else if let signInResult = signInResult {
switch (signInResult.signInState) {
case .signedIn:
print("User is signed in.")
case .smsMFA:
print("SMS message sent to \(signInResult.codeDetails!.destination!)")
default:
print("Sign In needs info which is not yet supported.")
}
}
}
}
我已实例化该类,并且提供了正确的凭据后,登录也可以工作,我想向警报显示错误消息,但是我可以打印该错误,这是可选的(找不到用户...。),但是我无法将其分配给类变量。
import RxSwift
let observable: Observable<Error?> = Observable<Error?>.just(self.awsUserPool?.userAuthenticationError)
let disposeBag = DisposeBag()
observable.subscribe { event in
print(event)
}
.disposed(by: disposeBag)
我首先会像这样围绕AWSMobileClient
编写一个反应式包装:
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()
}
}
}
然后将错误放入Observable中,请执行以下操作:
class AWSUserPool {
let userAuthenticationError: Observable<Error>
private let disposeBag = DisposeBag()
init(username: String, password: String) {
let result = AWSMobileClient.default().rx.signIn(username: username, password: password)
.materialize()
result
.compactMap { $0.element }
.subscribe(onNext: { signinResult in
switch signinResult.signInState {
case .signedIn:
print("User is signed in.")
case .smsMFA:
print("SMS message sent to \(signinResult.codeDetails!.destination!)")
default:
print("Sign In needs info which is not yet supported.")
}
})
.disposed(by: disposeBag)
userAuthenticationError = result.compactMap { $0.error }
}
}
尽管我可能不会为AWSUserPool感到烦恼……这取决于您。