对于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'时需要使用参数 <...>
然后如何在上一个请求之后将调用链接到下一个请求。非常感谢您的协助。