ios - 链接网络请求 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 错误:对泛型类型“结果”的引用需要 <...> 中的参数
然后我如何在前一个请求之后将调用链接到后续请求。非常感谢您提供的任何帮助。
解决方案
推荐阅读
- javascript - 在DFS-Javascript中到达末尾后如何遍历树
- ios - iPhone 能否有“无”位置 - 开启 GPS
- linux - 如何从 Linux 设备驱动程序强制刷新进程的缓存?
- php - 无法使用php从html多选项表单插入mysql
- jquery - 使用jquery对产品价格进行排序
- regex - 需要正则表达式来摆脱带有特定 url 的垃圾邮件脚本标签
- javascript - 无法访问从 React 中的 Web 服务返回的对象值
- node.js - TypeError:无法读取未定义的属性“默认”
- node.js - ObjectionJs andWhereRaw 不是 postgres 和 nodejs 的函数
- python - 在python 3中通过套接字发送文件