Ios 链接网络请求RxSwift

Ios 链接网络请求RxSwift,ios,swift,functional-programming,Ios,Swift,Functional Programming,我对RxSwift和函数式编程相对较新。我有一个应用程序,我需要进行一系列连续的网络呼叫,每个呼叫取决于另一个的输出。在我设计应用程序的过程中,这些调用不是在靠近视图或视图控制器的任何地方进行的,而是由对响应数据执行业务逻辑的数据提供程序类处理的。据我所知,好的Rx设计,订阅者应该站在链的顶端,而不是像这样纯粹在数据上执行业务和功能逻辑的类 我正在创建一个经过精心设计和简化的示例,以说明这些返回单曲的请求: func loginRequest(_ data: LoginData) -> S

我对RxSwift和函数式编程相对较新。我有一个应用程序,我需要进行一系列连续的网络呼叫,每个呼叫取决于另一个的输出。在我设计应用程序的过程中,这些调用不是在靠近视图或视图控制器的任何地方进行的,而是由对响应数据执行业务逻辑的数据提供程序类处理的。据我所知,好的Rx设计,订阅者应该站在链的顶端,而不是像这样纯粹在数据上执行业务和功能逻辑的类

我正在创建一个经过精心设计和简化的示例,以说明这些返回单曲的请求:

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()
        }
    }
}
func loginRequest(u数据:LoginData)->Single{
返回Single.create{observer->Disposable in
let request=LoginRequestWith(数据)
networkClient.send(请求){结果为
切换结果{
成功案例(让我们回答):
观察员(.success(response))
案例。失败(let错误):
观察者(.error(error))
}
}
归还一次性物品。创建{
networkClient.cancelRequest()
}
}
}
func userRequest(data:UserData)->Single{
返回Single.create{observer->Disposable in
let request=InfoRequestWith(数据)
networkClient.send(请求){结果为
切换结果{
成功案例(让我们回答):
观察员(.success(response))
案例。失败(let错误):
观察者(.error(error))
}
}
归还一次性物品。创建{
networkClient.cancelRequest()
}
}
}
func infoRequest(data:InfoData)->Single{
返回Single.create{observer->Disposable in
let request=InfoRequestWith(数据)
networkClient.send(请求){结果为
切换结果{
成功案例(让我们回答):
观察员(.success(response))
案例。失败(let错误):
观察者(.error(error))
}
}
归还一次性物品。创建{
networkClient.cancelRequest()
}
}
}
这些请求按预期工作,但是我正在调用它们,并使用提供程序类中的订阅/处置包不正确地处理它们,以使它们工作。我想做的是使用平面图或更合适的操作符链将它们链接在一起。这就是我被卡住的地方

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> 
    }
}
func login()->可观察{
webServices.loginRequest(loginData)
//验证成功?
.flatMap{导致
//现在调用userRequest,从第一个
//从infoRequest传递第二个
//它应该返回可观察的
}
}
我在哪里搞砸了?我在FlatMap中遇到了一些错误,但我知道这些错误最好与单打一起使用。我的错误似乎围绕着没有正确地将响应映射到新的可观察对象:

webServices.loginRequest(loginData)
.flatMap { response -> PrimitiveSequence<SingleTrait, Result> in
   return response
}
webServices.loginRequest(loginData)
.flatMap{响应->中的基本序列
返回响应
}
Xcode错误:引用泛型类型“Result”需要中的参数


然后,如何将调用链接到上一个请求之后的后续请求中。非常感谢您的帮助。

请分享您在
flatMap
中遇到的错误。在问题中添加了错误消息,因此
webServices
中的每个方法都返回一个不同的模型,包装在一个序列中。每次使用一种方法时,您都可以对其进行操作,然后最终使用最终结果作为观察结果。您可以使用
flatMap
链接这些请求,并使用前面的值,就像您已经做的那样。像这样
webServices.loginRequest(loginData)。flatMap{response->Single-in-return-webServices.userRequest(UserData模型)}
等等-谢谢你@Dimitris-这个信息非常有用-我还意识到,因为我没有订阅数据流,所以没有像我预期的那样实际发生任何事情-我将把它记为Rx初学者的一堂难学的课