swift - RxSwift 链接请求

标签 swift networking observable rx-swift chaining

我遇到的问题是链接 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 方法中的所有错误?

最佳答案

Mukesh 是正确的,您可能应该避免 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

关于swift - RxSwift 链接请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54286196/

相关文章:

node.js - docker桥接本地主机端口

networking - 如何在同一个工作站上使用多个 ngrok 帐户?

Angular 2 Observable http 服务错误处理

ios - AVVideoCompressionProperties按键崩溃

ios - UITableViewCell 掩码选择区域/选择区域的大小?

vb.net - 读取异步网络流

angular - 将 Observable 中的参数提供给返回 Observable 的函数

angular - 将 Angular2 Http 响应转换为 ConnectableObservable

ios - 重新创建一个单例

ios - 如何将按钮添加到 iOS 14 小部件