Означает ли порядок подписания и наблюдения?

Я немного смущен тем порядком, который вы можете назвать методами subscribeOn и observeOn для наблюдаемых. Я прочитал пару сообщений, и один ребята говорят, что это не имеет значения и просто использует вещь в его примере, а другие говорят, что это имеет значение. Итак, вот мой вопрос:

Например:

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)

Это то же самое, что:

  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)

Если я правильно понимаю механизмы, они разные. Первый выполняет всю работу над основным потоком, а второй выполняет всю работу над другим потоком, а затем отправляет обратно в основной поток. Но я уверен, что так может кто-то очистить это для меня, пожалуйста?

Ответы

Ответ 1

Если вы называете subscribeOn() в цепочке, это не имеет большого значения. То, что вы называете observeOn(), имеет значение.

subscribeOn() сообщает всей цепочке, для которой поток должен начинаться. Его нужно вызывать только один раз за цепочку. Если вы снова назовете его ниже, он не будет иметь никакого эффекта.

observOn() приводит к тому, что все выполняемые ниже операции выполняются в указанном планировщике. Вы можете вызывать его несколько раз в потоке для перемещения между различными потоками.

Возьмем следующий пример:

doSomethingRx()
    .subscribeOn(BackgroundScheduler)
    .doAnotherThing()
    .observeOn(ComputationScheduler)
    .doSomethingElse()
    .observeOn(MainScheduler)
    .subscribe(//...)
  • subscribeOn вызывает doSomethingRx для вызова в BackgroundScheduler.
  • doAnotherThing продолжит работу с BackgroundScheduler
  • затем observeOn переключает поток в ComputationScheduler
  • doSomethingElse произойдет на ComputationScheduler
  • другой observeOn переключает поток в MainScheduler
  • подписка происходит на MainScheduler

Ответ 2

Да, ты прав. observeOn будет получать события только в указанном вами потоке, тогда как subscribeOn фактически выполнит работу в указанном потоке.

Ответ 3

Оператор

.subscribeOn() влияет на то, какая цепочка планировщика будет создана (слева от него), и она будет работать один раз. .observeOn() воздействует на оператор справа от него - по которому данные планировщика будут обрабатываться после оператора.