Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
RxSwift行为延迟取消以前的调用,仅使用最近的调用_Swift_Reactive Programming_Rx Swift - Fatal编程技术网

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)