链接网络请求RxSwift

时间:2019-12-04 20:21:03

标签: ios swift functional-programming

对于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一起使用。我的错误似乎围绕着未将响应正确映射到新的可观察对象周围:

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

Xcode错误:引用通用类型'Result'时需要使用参数   <...>

然后如何在上一个请求之后将调用链接到下一个请求。非常感谢您的协助。

0 个答案:

没有答案