RxSwift BehaviorRelay取消先前的呼叫,仅使用最新的

时间:2019-02-21 20:15:55

标签: swift reactive-programming rx-swift

我有一个BehaviorRelay设置来存储地址数组,然后观察到BehaviorRelay,以便可以创建一个MKAnnotation数组,然后在地图上显示它。 / p>

let addresses = BehaviorRelay<[Address]>(value: [])

当用户将地图移动到新区域时,我会发出网络请求。 如果用户快速移动地图,我可能会遇到几个网络请求

我只想要最新的回复。

这是我的问题开始的地方。

    addresses.asObservable().subscribe(onNext: { [unowned self] (value) in
        self.fetchAllAnnotationsAndAddToMap()
    }).disposed(by: disposebag)
每次设置地址时都会调用

fetchAllAnnotationsAndAddToMap

fetchAllAnnotationsAndAddToMap可能需要很长时间才能完成。运行fetchAllAnnotationsAndAddToMap的请求被堆积起来,所有请求都运行完毕。

我想发生的是再次设置addresses后,我希望所有以前的呼叫都被丢弃,而只使用最新的呼叫。

我听说这就是flatMapLatest的目的。

但是,flatMapLatest要求我返回一个可观察对象,对此我感到困惑。

如何取消BehaviorRelay更新后仅使用最新方法的调用方法?

2 个答案:

答案 0 :(得分:2)

首先,您需要将fetchAllAnnotationsAndAddToMap()函数分解为两个函数。然后您可以:

addresses.asObservable()
    // you might want to put a `debounce` call in here.
    .flatMapLatest { addresses in 
        return fetchAllAnnotations(from: addresses)
    }
    .subscribe(onNext: { [weak self] annotations in 
        self?.addToMap(annotations)
    }
    .disposed(by: disposeBag)

答案 1 :(得分:2)

可能使用flatMapLatest是此问题的指定解决方案。但是,我想提出另一种解决方案:

只需在代码的BehaviorRelay部分重新初始化subscribe,然后过滤空的代码,就像这样:

  addresses.asObservable().filter({$0.count >0}).subscribe(onNext: { [unowned self] (value) in
    self.fetchAllAnnotationsAndAddToMap()
    self.addresses = BehaviorRelay<[Address]>(value: [])
}).disposed(by: disposebag)