Как Observer.onComplete () без onNext, работает в цепочке плоской карты?- Это должно пропустить все следующие flatmaps правильно? - PullRequest
0 голосов
/ 02 февраля 2019

Пожалуйста, взгляните на следующий фрагмент кода.


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



я могу видеть для action1, наблюдающий.onComplete без наблюдающего.onСледующий первый skipObservable заставляет наблюдателя переходить в завершенное состояние, пропуская вторую плоскую карту.

, но когда тот же набор плоской карты вызывается нажатием кнопки, состояние наблюдателя не завершается.

Пожалуйста, помогите мне понять разницу между ними.

1 Ответ

0 голосов
/ 03 февраля 2019

TL; DR - onAction2() не завершается, потому что он ждет, чтобы увидеть, произойдут ли еще какие-либо нажатия кнопок.


В onAction1() вы инициируете цепочку Observable с помощьюjust вызов.Оператор just выдает значение, а затем выдает завершенное событие.

В onAction2() вы запускаете цепочку Observable с помощью кнопки, которая выдает следующие события при касании, но не выдает завершенное событие, пока кнопка не выходит из области видимости.

В обоих случаяхЗатем вы перенаправляете событие в flatMapLatest вызов.Одно из свойств, которые имеют Observables flatMap, заключается в том, что они не завершаются до всех Observables, на которые они подписаны для завершения.В этом случае это последняя из наблюдаемых, созданных при запуске, и источник, наблюдаемый.

В обоих случаях наблюдаемая, которую flatMap создает при завершении, но источник не делаетt завершить в случае onAction2 (как описано выше), поэтому flatMap не завершится в этом случае.Он ждет, чтобы увидеть, произойдет ли еще какое-нибудь нажатие кнопки.

...