在每个请求之前调用的自定义“平面图”

Posted

技术标签:

【中文标题】在每个请求之前调用的自定义“平面图”【英文标题】:Custom "flatmap" to call before each request 【发布时间】:2018-01-26 07:46:45 【问题描述】:

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

这显然没有编译。

您对如何实现这样的和运算符有任何想法,或者可能有不同的实现方式。提前谢谢你。

【问题讨论】:

什么是R,这个运算符的返回值应该是什么? R 是 Moya 响应,它应该返回一个相同类型的 observable。 见下面我的回答。我认为这应该可以解决您的问题 【参考方案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
        
    


【讨论】:

以上是关于在每个请求之前调用的自定义“平面图”的主要内容,如果未能解决你的问题,请参考以下文章

在 viewDidLoad 之前调用 ViewController 上的自定义 init 方法

Redux 架构中的自定义 Websocket

SonataAdmin - 每个表单的自定义表单模板

在响应中的每个获取请求之前附加自定义标头

VS2010 负载测试:如何执行在每次负载测试之前运行一次的自定义操作

Django 表单向导 - 每个步骤的自定义表单布局