Означает ли порядок подписания и наблюдения?
Я немного смущен тем порядком, который вы можете назвать методами 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() воздействует на оператор справа от него - по которому данные планировщика будут обрабатываться после оператора.