RxSwift行为延迟取消以前的调用,仅使用最近的调用
我有一个RxSwift行为延迟取消以前的调用,仅使用最近的调用,swift,reactive-programming,rx-swift,Swift,Reactive Programming,Rx Swift,我有一个BehaviorRelay设置来存储一个地址数组,然后我观察到BehaviorRelay,这样我就可以创建一个MKAnnotation数组,然后在地图上显示它 let addresses = BehaviorRelay<[Address]>(value: []) fetchallannotationsanddtomap在每次设置地址时都会被调用 fetchallannotationsanddtomap可能需要很长时间才能完成。运行fetchallannotationsand
BehaviorRelay
设置来存储一个地址数组,然后我观察到BehaviorRelay
,这样我就可以创建一个MKAnnotation
数组,然后在地图上显示它
let addresses = BehaviorRelay<[Address]>(value: [])
fetchallannotationsanddtomap
在每次设置地址时都会被调用
fetchallannotationsanddtomap
可能需要很长时间才能完成。运行fetchallannotationsanddtomap
的请求会堆积起来,所有请求都会运行到完成
我想做的是,一旦再次设置了地址
,我想放弃所有以前的调用,只使用最新的调用
我听说这就是flatMapLatest的用途
然而,flatMapLatest要求我返回一个可观察的,我对此感到困惑
如何取消更新
行为规则后调用的方法并仅使用最新的方法?首先,您需要将fetchallannotations和addtomap()
函数分成两个函数。然后你可以:
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)
可能使用flatMapLatest
是解决此问题的指定解决方案。但是,我想提出另一种解决方案:
只需在订阅
部分代码中重新初始化行为延迟
,然后过滤空代码,如下所示:
addresses.asObservable().filter({$0.count >0}).subscribe(onNext: { [unowned self] (value) in
self.fetchAllAnnotationsAndAddToMap()
self.addresses = BehaviorRelay<[Address]>(value: [])
}).disposed(by: disposebag)
addresses.asObservable().filter({$0.count>0}).subscribe(onNext:{[unowned self](值)在中
self.fetchallannotationsanddtomap()
self.addresses=BehaviorRelay(值:[])
}).处置(由:处置人)
这不会取消对地址的所有订阅吗?@YichenBman是的,你是对的,你应该再次订阅,我已将订阅代码放入UIbutton点击操作中:(
addresses.asObservable().filter({$0.count >0}).subscribe(onNext: { [unowned self] (value) in
self.fetchAllAnnotationsAndAddToMap()
self.addresses = BehaviorRelay<[Address]>(value: [])
}).disposed(by: disposebag)