RxSwift BehaviorRelay取消之前的调用,仅使用最新的调用

问题描述 投票:2回答:2

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

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

当用户将地图移动到新区域时,我会发出网络请求。如果用户非常快速地移动地图,我最终会得到几个网络请求

我只想要最新的回复。

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

    addresses.asObservable().subscribe(onNext: { [unowned self] (value) in
        self.fetchAllAnnotationsAndAddToMap()
    }).disposed(by: disposebag)

每次设置地址时都会调用fetchAllAnnotationsAndAddToMapgets。

fetchAllAnnotationsAndAddToMap可能需要很长时间才能完成。请求运行fetchAllAnnotationsAndAddToMapget,并且所有这些请求都已完成。

我想要发生的是一旦addresses再次设置,我希望所有以前的调用被丢弃,只使用最新的。

我听说这是flatMapLatest的用途。

但是,flatMapLatest要求我返回一个observable,我对此感到困惑。

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

swift reactive-programming rx-swift
2个回答
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)

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)
© www.soinside.com 2019 - 2024. All rights reserved.