没有 onNext 的 observer.onComplete() 如何在 flatmap 链中工作? - 它必须跳过所有以下平面图,对吗?
How observer.onComplete() without onNext, works in chain of flatmap?. - It has to skip all the following flatmaps Right?
请看下面的代码片段。
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: [=11=])}
.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: [=11=])}
.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: [=11=])}
}
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
我可以看到对于 action1,第一个 skipObservable 的 observer.onComplete 没有 observer.onNext 导致观察者进入完成状态,跳过第二个平面图。
但是当使用按钮点击调用同一组平面图时,观察者的状态没有完成。
请帮我理解一下两者的区别。
TL;DR - onAction2()
未完成,因为它正在等待查看是否还会发生更多按钮点击。
在 onAction1()
中,您正在使用 just
调用启动 Observable 链。 just
运算符发出一个值,然后发出一个完成的事件。
在 onAction2()
中,您使用一个按钮启动 Observable 链,该按钮在点击时发出下一个事件,但在按钮超出范围之前不会发出完成的事件。
在这两种情况下,您都将事件路由到 flatMapLatest
调用中。 flatMap Observables 具有的属性之一是它们不会完成,直到它们订阅的 all 个 Observables 完成。在这种情况下,它既是它在触发时创建的最新 Observable,也是源 Observable。
在这两种情况下,flatMap 在触发时创建的 Observable 已完成,但源 在 onAction2 情况下未 完成(如上所述),因此 flatMap 不会'在那种情况下不完整。它正在等待查看是否会发生更多的按钮点击。
请看下面的代码片段。
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: [=11=])}
.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: [=11=])}
.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: [=11=])}
}
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
我可以看到对于 action1,第一个 skipObservable 的 observer.onComplete 没有 observer.onNext 导致观察者进入完成状态,跳过第二个平面图。
但是当使用按钮点击调用同一组平面图时,观察者的状态没有完成。
请帮我理解一下两者的区别。
TL;DR - onAction2()
未完成,因为它正在等待查看是否还会发生更多按钮点击。
在 onAction1()
中,您正在使用 just
调用启动 Observable 链。 just
运算符发出一个值,然后发出一个完成的事件。
在 onAction2()
中,您使用一个按钮启动 Observable 链,该按钮在点击时发出下一个事件,但在按钮超出范围之前不会发出完成的事件。
在这两种情况下,您都将事件路由到 flatMapLatest
调用中。 flatMap Observables 具有的属性之一是它们不会完成,直到它们订阅的 all 个 Observables 完成。在这种情况下,它既是它在触发时创建的最新 Observable,也是源 Observable。
在这两种情况下,flatMap 在触发时创建的 Observable 已完成,但源 在 onAction2 情况下未 完成(如上所述),因此 flatMap 不会'在那种情况下不完整。它正在等待查看是否会发生更多的按钮点击。