自定义 "flatmap" 在每个请求之前调用
Custom "flatmap" to call before each request
所以我拥有的是一个使用 REST 端点的应用程序,但在它可以使用它之前。它必须调用注册端点,该端点将 DeviceId 分配给必须在所有后续 API 调用中使用的设备。
目前我正在使用 Moya 和 RxSwift 来链接和转换请求。
我在想我会像这样根据我的要求调用自定义运算符
self.mapRect
.waitForDeviceId()
.flatMap { [weak self] mapRect -> Single<Response> in
...
weakSelf.provider.rx.request(PCDepartmentTarget.list(coordinate: center, distance: maxDistance))
}
.map(to: [PCParkingLot].self)
.bind(to: self.parkingLotOVariable)
.disposed(by: self.disposeBag)
我认为 waitForDeviceId() 应该看起来像这样。
extension ObservableType {
func waitForDeviceId<R>() -> Observable<R> {
PCDeviceIdService.shared.deviceIdObservable.flatMap { _ -> Observable<R> in
return self
}
}
}
这显然不是编译。
您对如何实现这样的 and 运算符或可能采用不同的实现方式有任何想法吗?提前谢谢你。
我想你要做的应该是这样的:
extension ObservableType {
//E comes from ObservableType itself. You don't have to declare it.
func waitForDeviceId() -> Observable<E> {
//flatMap self catching the element (for example mapRect)
return flatMap { e in
PCDeviceIdService.shared.deviceIdObservable()
.map{ _ in e } //map deviceIdObservable back into e
}
}
}
所以我拥有的是一个使用 REST 端点的应用程序,但在它可以使用它之前。它必须调用注册端点,该端点将 DeviceId 分配给必须在所有后续 API 调用中使用的设备。
目前我正在使用 Moya 和 RxSwift 来链接和转换请求。
我在想我会像这样根据我的要求调用自定义运算符
self.mapRect
.waitForDeviceId()
.flatMap { [weak self] mapRect -> Single<Response> in
...
weakSelf.provider.rx.request(PCDepartmentTarget.list(coordinate: center, distance: maxDistance))
}
.map(to: [PCParkingLot].self)
.bind(to: self.parkingLotOVariable)
.disposed(by: self.disposeBag)
我认为 waitForDeviceId() 应该看起来像这样。
extension ObservableType {
func waitForDeviceId<R>() -> Observable<R> {
PCDeviceIdService.shared.deviceIdObservable.flatMap { _ -> Observable<R> in
return self
}
}
}
这显然不是编译。
您对如何实现这样的 and 运算符或可能采用不同的实现方式有任何想法吗?提前谢谢你。
我想你要做的应该是这样的:
extension ObservableType {
//E comes from ObservableType itself. You don't have to declare it.
func waitForDeviceId() -> Observable<E> {
//flatMap self catching the element (for example mapRect)
return flatMap { e in
PCDeviceIdService.shared.deviceIdObservable()
.map{ _ in e } //map deviceIdObservable back into e
}
}
}