RxSwift Цепные запросы - PullRequest
       34

RxSwift Цепные запросы

0 голосов
/ 21 января 2019

Проблема, с которой я столкнулся - это связывание 2 запросов и обработка ошибок.Ниже приведен пример моего кода:

func fbLogin() -> Observable<String> { ... }

func userLogin(request: Request) -> Observable<User> { ... }

let signedWithLogin = loginTaps
    .asDriver(onErrorJustReturn: ())
    .flatMapLatest { _ in
        return fbLogin()
        .map({ ReqestState<String>.loaded($0) })
        .asDriver(onErrorRecover: { error  in
            return Driver.just(.error(error))
        })
        .startWith(.loading)
     }
     .map({ UserEndpoint.socialLogin(token: $0) })
     .flatMapLatest { request in
         return userLogin(request: request)
         .map({ ReqestState<User>.loaded($0) })
         .asDriver(onErrorRecover: { error  in
              return Driver.just(.error(error))
         })
         .startWith(.loading)
     }

signedWithLogin
    .drive(onNext: { response in
        print(response)
     })
    .disposed(by: disposeBag)

Проблема в том, что когда я отменяю всплывающее окно входа в Facebook, я отправляю сообщение observer.onError(FBLoginManagerError.canceled).Эта ошибка сначала перехватывает метод. asDriver(onErrorRecover: { error, но не переходит к методу .drive(onNext: { response.

Как я могу перехватить все ошибки в методе .asDriver(onErrorRecover: { error?

1 Ответ

0 голосов
/ 22 января 2019

Мукеш прав, что вам, вероятно, следует избегать 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 с.

...