请看看下面的代码片段。
class ViewController: UIViewController {
let disposeBag = DisposeBag()
@IBOutlet weak var clickMe: UIButton!
override func viewDidLoad() {
super.viewDidLoad()
onAction1()
onAction2()
}
func onAction1(){
Observable.just(4)
.flatMapLatest{self.performTask(value: $0)}
.subscribe(onNext:{ data in
print("data is")
print(data)
}, onCompleted: {
print("task completed")
})
.disposed(by: disposeBag)
}
func onAction2(){
clickMe.rx.tap
.map{4}
.flatMapLatest{self.performTask(value: $0)}
.subscribe(onNext:{ data in
print("data is")
print(data)
}, onCompleted: {
print("task completed")
})
.disposed(by: disposeBag)
}
func performTask(value:Int) -> Observable<Int>{
return self.skipObservable(value:value)
// need to skip the following flatmap when value is 4
.flatMapLatest{self.multipierObservable(value: $0)}
}
func multipierObservable(value:Int) -> Observable<Int>{
return Observable.just(value*value)
}
func skipObservable(value:Int) -> Observable<Int>{
return Observable.create { (observer:AnyObserver<Int>) -> Disposable in
print("value is", value)
if value == 4{
observer.onCompleted()
}
else {
observer.onNext(value)
observer.onCompleted()
}
return Disposables.create()
}
}
}
样本输出
value is 4
task completed
/// output on button tap. Not printing 'task completed'? Why? please advice
value is 4
我可以看到动作1,不首先skipObservable的observer.onNext的observer.onComplete使观察者去完成状态跳过第二flatmap。
但是,当同一组flatmap的正在使用一个按钮自来水叫,观察者的状态没有得到完成。
请帮我理解这两者之间的区别。
TL; DR - 的onAction2()
,因为它在等待,看是否有更多的按钮,水龙头会出现不完整的。
在onAction1()
你启动与just
调用的可观测链。该just
运营商发出值,然后发出一个完成的事件。
在onAction2()
你正在发起一个按钮轻敲后发出下一个事件,但直到按钮超出范围未发出完成事件的可观测链。
在这两种情况下,你再路由事件到flatMapLatest
电话。一个flatMap观测量具有的特性是,他们没有完成,直到所有他们所订阅完成观测值。在这种情况下,这两个最新的可观察它所创建的,当它被触发,以及源观测。
在这两种情况下,可观察到的是,flatMap创建触发完成时,但源在onAction2情况下不完整的(如上所述),所以flatMap在这种情况下无法完成。它在等待,看是否有更多的按钮,水龙头会发生。