Пользовательская плоская карта для вызова перед каждым запросом

Итак, у меня есть приложение, которое использует конечную точку 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
        }
    }
}

Который явно не компилируется.

Есть ли у вас какие-либо идеи о том, как реализовать такой и оператор или, возможно, другой способ сделать это. Заранее спасибо.


person Tommy Sadiq Hinrichsen    schedule 26.01.2018    source источник
comment
Что такое R и каким должен быть возврат этого оператора?   -  person Timofey Solonin    schedule 26.01.2018
comment
R — это ответ Мойи, он должен возвращать наблюдаемое того же типа.   -  person Tommy Sadiq Hinrichsen    schedule 26.01.2018
comment
см. мой ответ ниже. Я думаю, это должно решить вашу проблему   -  person Timofey Solonin    schedule 26.01.2018


Ответы (1)


Я думаю, что то, что вы пытаетесь сделать, должно выглядеть так:

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

}
person Timofey Solonin    schedule 26.01.2018