Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Does the order of subscribeOn and observeOn matter?

I'm a little bit confused about the order you can call the subscribeOn and observeOn methods on observables. I read a couple of posts and one guys says that it doesn't matter and just uses thing in his example and other people say it does matter. So here is my question:

For example:

self.remoteService.rxGetAllLanguages()             .observeOn(MainScheduler.instance)             .subscribeOn(ConcurrentDispatchQueueScheduler(globalConcurrentQueueQOS: .Background))             .subscribe({ e in                 switch e {                 case .Next(let element):                  case .Error(let e):                     DDLogError("Error in  \(e)")                 case .Completed:                     DDLogDebug("Completed")                 }                 }             ).addDisposableTo(self.disposeBag) 

Is that the same as:

  self.remoteService.rxGetAllLanguages()                     .subscribeOn(ConcurrentDispatchQueueScheduler(globalConcurrentQueueQOS: .Background))                     .observeOn(MainScheduler.instance)                     .subscribe({ e in                         switch e {                         case .Next(let element):                          case .Error(let e):                             DDLogError("Error in  \(e)")                         case .Completed:                             DDLogDebug("Completed")                         }                         }                     ).addDisposableTo(self.disposeBag) 

If I correctly understand the mechanisms they are different. The first one does all the work on the main thread and the second does all the work on another thread and then dispatches back to the main thread. But I'm nut sure so can someone clear this for me please?

like image 580
user1007522 Avatar asked Jun 22 '16 16:06

user1007522


People also ask

What is ObserveOn and subscribeOn?

The first subscribeOn changes the thread to IO thread and though the subsequent subscribeOn tries to change the thread to computation thread, it is rendered obsolete by the subscribeOn preceding it. On the contrary observeOn is able to change threads in subsequent calls as evident from the output of the logs.

What is subscribeOn?

subscribeOn() operator tells the source Observable which thread to emit and push items on all the way down to Observer (hence, it affects both upstream and downstream operators). It does not matter where you put the subscribeOn() in your Observable chain of operators.

What is ObserveOn in Rxjava?

ObserveOn specify the Scheduler on which an observer will observe this Observable. So basically SubscribeOn is mostly subscribed (executed) on a background thread ( you do not want to block the UI thread while waiting for the observable) and also in ObserveOn you want to observe the result on a main thread...


2 Answers

Where you call subscribeOn() in a chain doesn't really matter. Where you call observeOn() does matter.

subscribeOn() tells the whole chain which thread to start processing on. You should only call it once per chain. If you call it again lower down the stream it will have no effect.

observeOn() causes all operations which happen below it to be executed on the specified scheduler. You can call it multiple times per stream to move between different threads.

Take the following example:

doSomethingRx()     .subscribeOn(BackgroundScheduler)     .doAnotherThing()     .observeOn(ComputationScheduler)     .doSomethingElse()     .observeOn(MainScheduler)     .subscribe(//...) 
  • The subscribeOn causes doSomethingRx to be called on the BackgroundScheduler.
  • doAnotherThing will continue on BackgroundScheduler
  • then observeOn switches the stream to the ComputationScheduler
  • doSomethingElse will happen on the ComputationScheduler
  • another observeOn switches the stream to the MainScheduler
  • subscribe happens on the MainScheduler
like image 88
Jahnold Avatar answered Oct 04 '22 14:10

Jahnold


Yea you're correct. observeOn will only receive the events on the thread you've specified, whereas subscribeOn will actually execute the work within the specified thread.

like image 33
solidcell Avatar answered Oct 04 '22 12:10

solidcell