RxSwift BehaviorRelay 取消之前的调用,只使用最近的
RxSwift BehaviorRelay cancel previous calls, only use the most recent
我有一个 BehaviorRelay
设置来存储地址数组,然后我观察到 BehaviorRelay
这样我就可以创建一个 MKAnnotation
数组然后将其显示在地图上.
let addresses = BehaviorRelay<[Address]>(value: [])
当用户将地图移动到新区域时,我发出网络请求。
如果用户移动地图的速度非常快,我最终会收到几个网络请求
我只想要最新的回复。
这是我的问题开始的地方。
addresses.asObservable().subscribe(onNext: { [unowned self] (value) in
self.fetchAllAnnotationsAndAddToMap()
}).disposed(by: disposebag)
fetchAllAnnotationsAndAddToMap
每次设置地址时调用。
fetchAllAnnotationsAndAddToMap
可能需要很长时间才能完成。 运行 fetchAllAnnotationsAndAddToMap
的请求堆积起来,所有请求都 运行 完成。
我想要发生的是一旦 addresses
再次设置,我希望丢弃所有以前的调用并只使用最新的。
我听说这就是 flatMapLatest
的用途。
但是,flatMapLatest 需要我 return 一个可观察对象,我对此感到困惑。
如何取消BehaviorRelay
更新后调用的方法,只使用最近的?
首先,您需要将 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)
可能使用flatMapLatest
是这个problem.However的指定解决方案,我想提出另一个解决方案:
只需在代码的 subscribe
部分再次重新初始化 BehaviorRelay
,然后过滤空的,像这样:
addresses.asObservable().filter({[=10=].count >0}).subscribe(onNext: { [unowned self] (value) in
self.fetchAllAnnotationsAndAddToMap()
self.addresses = BehaviorRelay<[Address]>(value: [])
}).disposed(by: disposebag)
我有一个 BehaviorRelay
设置来存储地址数组,然后我观察到 BehaviorRelay
这样我就可以创建一个 MKAnnotation
数组然后将其显示在地图上.
let addresses = BehaviorRelay<[Address]>(value: [])
当用户将地图移动到新区域时,我发出网络请求。 如果用户移动地图的速度非常快,我最终会收到几个网络请求
我只想要最新的回复。
这是我的问题开始的地方。
addresses.asObservable().subscribe(onNext: { [unowned self] (value) in
self.fetchAllAnnotationsAndAddToMap()
}).disposed(by: disposebag)
fetchAllAnnotationsAndAddToMap
每次设置地址时调用。
fetchAllAnnotationsAndAddToMap
可能需要很长时间才能完成。 运行 fetchAllAnnotationsAndAddToMap
的请求堆积起来,所有请求都 运行 完成。
我想要发生的是一旦 addresses
再次设置,我希望丢弃所有以前的调用并只使用最新的。
我听说这就是 flatMapLatest
的用途。
但是,flatMapLatest 需要我 return 一个可观察对象,我对此感到困惑。
如何取消BehaviorRelay
更新后调用的方法,只使用最近的?
首先,您需要将 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)
可能使用flatMapLatest
是这个problem.However的指定解决方案,我想提出另一个解决方案:
只需在代码的 subscribe
部分再次重新初始化 BehaviorRelay
,然后过滤空的,像这样:
addresses.asObservable().filter({[=10=].count >0}).subscribe(onNext: { [unowned self] (value) in
self.fetchAllAnnotationsAndAddToMap()
self.addresses = BehaviorRelay<[Address]>(value: [])
}).disposed(by: disposebag)