没有 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 不会'在那种情况下不完整。它正在等待查看是否会发生更多的按钮点击。