Мукеш прав, что вам, вероятно, следует избегать Driver
до конца.Кроме того, нет смысла иметь оба типа RequestState
, когда вы действительно заботитесь только о конечном (RequestState<User>
)
Вот более простая версия, которая, я думаю, будет делать то, что вы хотите:
let signedWithLogin = loginTaps
.flatMapLatest {
fbLogin()
.map { UserEndpoint.socialLogin(token: $0) }
.flatMap { userLogin(request: $0) }
.map { RequestState.loaded($0) }
.catchError { .just(.error($0)) }
.startWith(.loading)
}
.asDriver(onErrorRecover: { fatalError($0.localizedDescription) }) // I'm using `fatalError()` here because if the above emits an error something has gone horribly wrong (like the RxSwift library isn't working anymore.)
signedWithLogin
.drive(onNext: { response in
print(response)
})
.disposed(by: disposeBag)
Вышеприведенное предполагает, что вы изменяете свою функцию UserEndpoint.socialLogin(token:)
так, чтобы она принимала строку вместо RequestState<String>
.
Также предполагается, что fbLogin()
и userLogin(request:)
выдают только одно значение каждый.Возможно, вы захотите переключить их на Single
с.