Я бы сначала написал реактивную оболочку вокруг 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 ... Это зависит от вас.