如何observer.onComplete()不onNext,工作在flatmap链? - 它跳过所有下面的flatmaps对吗?

问题描述 投票:1回答:1

请看看下面的代码片段。


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的正在使用一个按钮自来水叫,观察者的状态没有得到完成。

请帮我理解这两者之间的区别。

ios swift reactive-programming rx-swift
1个回答
2
投票

TL; DR - 的onAction2(),因为它在等待,看是否有更多的按钮,水龙头会出现不完整的。


onAction1()你启动与just调用的可观测链。该just运营商发出值,然后发出一个完成的事件。

onAction2()你正在发起一个按钮轻敲后发出下一个事件,但直到按钮超出范围未发出完成事件的可观测链。

在这两种情况下,你再路由事件到flatMapLatest电话。一个flatMap观测量具有的特性是,他们没有完成,直到所有他们所订阅完成观测值。在这种情况下,这两个最新的可观察它所创建的,当它被触发,以及源观测。

在这两种情况下,可观察到的是,flatMap创建触发完成时,但源在onAction2情况下不完整的(如上所述),所以flatMap在这种情况下无法完成。它在等待,看是否有更多的按钮,水龙头会发生。

© www.soinside.com 2019 - 2024. All rights reserved.