如何使用 Moya RxSwift 合并 REST 数组
how to use Moya RxSwift to get an array of REST merged
我正在努力学习 RxSwift。我一直在使用 Moya,现在想试试 RxSwift。完全糊涂了。
let popServiceProvider = MoyaProvider<PopRESTService>()
let o1 = popServiceProvider.rx.request(.getPopByCity(city: "London")).asObservable()
let o2 = popServiceProvider.rx.request(.getPopByCity(city: "Tokyo")).asObservable()
let pObservables:[Observable<Response>] = [o1, o2]
let stats: Observable<Response> = Observable.combineLatest(pObservables)
let m = stats.map({ a in
print(a)
})
首先我在 let stats 上得到一个错误:
无法将类型 'Observable<[Response]>' 的值转换为指定类型 'Observable'
我的方向是否正确?
编辑:
即使这样也行不通。永远不要先订阅:
wServiceProvider.rx.request(.getWeatherByCity(city: "Chicago"))
.debug()
.map(Weather.self)
.subscribe({ (event) in
switch event {
case let .success(response):
print(response)
case let .error(response):
print(response)
}
})
.disposed(by: self.disposeBag)
我建议使用 combineLatest
的 Observable.combineLatest(o1, o2)
变体(此形式受 8 个参数限制)
假设从 case getPopByCity(city: String)
返回的类型可能如下所示:
struct PopByCity: Decodable {
let count: Float
}
您可能想要这样实现请求:
Observable.combineLatest(o1, o2)
.map { (resp1: Response, resp2: Response) -> [PopByCity] in
let pop1 = try? JSONDecoder().decode(PopByCity.self, from: resp1.data)
let pop2 = try? JSONDecoder().decode(PopByCity.self, from: resp2.data)
return [pop1, pop2].compactMap { [=11=] }
}
.subscribe(onNext: { (result: [PopByCity]) in
print(result)
})
.disposed(by: disposeBag)
但是如果您仍然需要一组请求:
Observable.combineLatest([o1, o2])
.map { (responses: [Response]) -> [PopByCity] in
responses.map { try? JSONDecoder().decode(PopByCity.self, from: [=12=].data) }
.compactMap { [=12=] }
}
.subscribe(onNext: { (result: [PopByCity]) in
print(result)
})
.disposed(by: disposeBag)
对于第二个选项,请记住,同时发送大量异步请求不是一个好习惯。对于需要执行的许多请求,如果您必须在最后一个响应后的一个地方处理所有响应,我建议使用 Concat operator or combination of Concat + Reduce。
我对Apple XCTest的误解。我需要添加:
expectation.fulfill()
在我的订阅中。
Observable.combineLatest([o1, o2])
.map { (responses: [Response]) -> [Weather] in
responses.map { try? JSONDecoder().decode(Weather.self, from: [=11=].data) }
.compactMap { [=11=] }
}
.debug()
.subscribe(onNext: { (result: [Weather]) in
print(result)
expectation.fulfill()
})
.disposed(by: disposeBag)
我正在努力学习 RxSwift。我一直在使用 Moya,现在想试试 RxSwift。完全糊涂了。
let popServiceProvider = MoyaProvider<PopRESTService>()
let o1 = popServiceProvider.rx.request(.getPopByCity(city: "London")).asObservable()
let o2 = popServiceProvider.rx.request(.getPopByCity(city: "Tokyo")).asObservable()
let pObservables:[Observable<Response>] = [o1, o2]
let stats: Observable<Response> = Observable.combineLatest(pObservables)
let m = stats.map({ a in
print(a)
})
首先我在 let stats 上得到一个错误:
无法将类型 'Observable<[Response]>' 的值转换为指定类型 'Observable'
我的方向是否正确?
编辑:
即使这样也行不通。永远不要先订阅:
wServiceProvider.rx.request(.getWeatherByCity(city: "Chicago"))
.debug()
.map(Weather.self)
.subscribe({ (event) in
switch event {
case let .success(response):
print(response)
case let .error(response):
print(response)
}
})
.disposed(by: self.disposeBag)
我建议使用 combineLatest
的 Observable.combineLatest(o1, o2)
变体(此形式受 8 个参数限制)
假设从 case getPopByCity(city: String)
返回的类型可能如下所示:
struct PopByCity: Decodable {
let count: Float
}
您可能想要这样实现请求:
Observable.combineLatest(o1, o2)
.map { (resp1: Response, resp2: Response) -> [PopByCity] in
let pop1 = try? JSONDecoder().decode(PopByCity.self, from: resp1.data)
let pop2 = try? JSONDecoder().decode(PopByCity.self, from: resp2.data)
return [pop1, pop2].compactMap { [=11=] }
}
.subscribe(onNext: { (result: [PopByCity]) in
print(result)
})
.disposed(by: disposeBag)
但是如果您仍然需要一组请求:
Observable.combineLatest([o1, o2])
.map { (responses: [Response]) -> [PopByCity] in
responses.map { try? JSONDecoder().decode(PopByCity.self, from: [=12=].data) }
.compactMap { [=12=] }
}
.subscribe(onNext: { (result: [PopByCity]) in
print(result)
})
.disposed(by: disposeBag)
对于第二个选项,请记住,同时发送大量异步请求不是一个好习惯。对于需要执行的许多请求,如果您必须在最后一个响应后的一个地方处理所有响应,我建议使用 Concat operator or combination of Concat + Reduce。
我对Apple XCTest的误解。我需要添加:
expectation.fulfill()
在我的订阅中。
Observable.combineLatest([o1, o2])
.map { (responses: [Response]) -> [Weather] in
responses.map { try? JSONDecoder().decode(Weather.self, from: [=11=].data) }
.compactMap { [=11=] }
}
.debug()
.subscribe(onNext: { (result: [Weather]) in
print(result)
expectation.fulfill()
})
.disposed(by: disposeBag)