自定义" flatmap"在每个请求之前调用

时间:2018-01-26 07:46:46

标签: ios swift rx-swift reactive moya

所以我拥有的是一个使用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
        }
    }
}

显然没有编译。

您对如何实现此类和运算符或者可能采用不同的方法有任何想法。提前谢谢。

1 个答案:

答案 0 :(得分:0)

我认为你要做的事情应该是这样的:

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
        }
    }

}