Beginning RxSwift - Part 7: Challenge: | Ray Wenderlich Videos

Get introduced to the do operator for performing side effects, and then use the do operator in an example from the previous video.


This is a companion discussion topic for the original entry at https://www.raywenderlich.com/4743-beginning-rxswift/lessons/7

What is difference between following:
Case 1:

let observable = Observable<Any>.never()
  observable
    .do(onNext: { (test) in
      print(test)
    }, onError: { (error) in
      print("Error")
    }, onCompleted: {
      print("Completed do")
    }, onSubscribe: {
      print("Subscribe do")
    }, onSubscribed: {
      print("Subscribed do")
    }, onDispose: {
      print("Dispose do")
    })
  observable
    .subscribe(
      onNext: { element in
        print(element)
    },
      onCompleted: {
        print("Completed")
    },
      onDisposed: {
        print("Disposed")
    }
  )

Case 2:

let observable = Observable<Any>.never()
observable
    .do(onNext: { (test) in
      print(test)
    }, onError: { (error) in
      print("Error")
    }, onCompleted: {
      print("Completed do")
    }, onSubscribe: {
      print("Subscribe do")
    }, onSubscribed: {
      print("Subscribed do")
    }, onDispose: {
      print("Dispose do")
    })
    .subscribe(
      onNext: { element in
        print(element)
    },
      onCompleted: {
        print("Completed")
    },
      onDisposed: {
        print("Disposed")
    }
  )

In the above mentioned case, 1st snippet doesn’t print the statements of ‘do’ operator while 2nd case works as expected. What is the difference?

In the first snippet do is not part of a subscription.

Ok, so do works only when it is part of chained subscription call?

@scotteg Can you please help with this when you get a chance? Thank you - much appreciated! :]

Correct. An observable emits to subscribers. do is a side effect, not a subscription.

Thank you. More clearer now

not clear to me why on console prints only once “about to subscribe” with my test shouldn’t I see “disposed in do” too?:

let disposeBag = DisposeBag()
let neverObservable = Observable<Any>.never()

neverObservable

    .do(
        onSubscribe: {
            print("about to subscribe")
    },
        onDispose: {
            print(print("disposed in do"))
    })

    .subscribe(
        onNext: { element in
        print(element)
    },
        onCompleted: {
        print("OK! Completed!")
    },
       onDisposed: {
        print("disposed")
    })
    .disposed(by: disposeBag)