首页 > 解决方案 > 链接网络请求 RxSwift

问题描述

我对 RxSwift 和函数式编程比较陌生。我有一个应用程序,我需要在其中进行一组连续的网络调用,每个调用都取决于另一个调用的输出。我是如何构建应用程序的,这些调用不会在靠近视图或视图控制器的任何地方进行 - 它们由对响应数据执行业务逻辑的数据提供者类处理。据我了解,良好的 Rx 设计,订阅者应该留在链的顶端,而不是像这些纯粹对数据执行业务和功能逻辑的类。

我正在创建一个人为的简化示例,以从这些返回 Singles 的请求中进行说明:

func loginRequest(_ data: LoginData) -> Single<LoginResponse> {
    return Single.create { observer -> Disposable in
        let request = LoginRequestWith(data)
        networkClient.send(request) { result in
            switch result {
            case .success(let response):
                observer(.success(response))
            case .failure(let error):
                observer(.error(error))
            }
        }
        return Disposables.create {
            networkClient.cancelRequest()
        }
    }
}

func userRequest(_ data: UserData) -> Single<UserResponse> {
    return Single.create { observer -> Disposable in
        let request = InfoRequestWith(data)
        networkClient.send(request) { result in
            switch result {
            case .success(let response):
                observer(.success(response))
            case .failure(let error):
                observer(.error(error))
            }
        }
        return Disposables.create {
            networkClient.cancelRequest()
        }
    }
}

func infoRequest(_ data: InfoData) -> Single<InfoResponse> {
    return Single.create { observer -> Disposable in
        let request = InfoRequestWith(data)
        networkClient.send(request) { result in
            switch result {
            case .success(let response):
                observer(.success(response))
            case .failure(let error):
                observer(.error(error))
            }
        }
        return Disposables.create {
            networkClient.cancelRequest()
        }
    }
}

这些请求按预期工作,但是我使用提供程序类中的订阅/处置包不正确地调用和处理它们以使它们工作。我想要做的是使用 FlatMap 或更合适的运算符链将它们链接在一起。这就是我卡住的地方。

func login() -> Observable<InfoData> {
  webServices.loginRequest(loginData)
    // verify success?
    .flatMap { result in
      // Now call userRequest passing the response from the first
      // and from that infoRequest passing the response from the second
      // Which should return the Observable<InfoData> 
    }
}

我在哪里搞砸了?我收到有关 FlatMap 的错误,但我知道这些最适合与 Singles 一起使用。我的错误似乎围绕着没有将响应正确映射到新的 observable:

webServices.loginRequest(loginData)
.flatMap { response -> PrimitiveSequence<SingleTrait, Result> in
   return response
}

Xcode 错误:对泛型类型“结果”的引用需要 <...> 中的参数

然后我如何在前一个请求之后将调用链接到后续请求。非常感谢您提供的任何帮助。

标签: iosswiftfunctional-programming

解决方案


推荐阅读