Когда дело доходит до обеспечения выполнения определенного фрагмента кода Observable.create
в определенном потоке (т.е. фоновом потоке), я беспокоюсь, что использование оператора subscribeOn
может не сработать, потому что бывают случаи, когда я могу связать эту наблюдаемую последовательность с другой наблюдаемой последовательностью, которая выполняется в основном потоке (с использованием observeOn
).
Пример
Ситуация такова, что у меня есть наблюдаемая последовательность, работающая в основном потоке (то есть окно предупреждения, запрашивающее у пользователя ввод, о том, выполнять ли сетевой вызов или нет).
Было бы лучше убедиться, что этот Observable.create
код выполняется в фоновом потоке, используя что-то вроде:
Observable<String>.empty()
.observeOn(ConcurrentMainScheduler(queue: background.queue))
.concat(myObservableNetworkCall)
Почему бы просто не использовать subscribeOn
?
Проблема в том, что если бы я использовал subscribeOn
(второй), а предыдущий наблюдаемый (контроллер предупреждений) был настроен на запуск в фоновом потоке с использованием subscribeOn
(первый), то второй оператор subscribeOn
не работал бы, поскольку первый вызов ближе к наблюдаемый источник:
Если вы укажете несколько операторов subscribeOn (), будет использоваться тот, который приближается к источнику (крайний левый).
- Томас Нильд об операторах subscribeOn и ObserveOn в RxJava (февраль 2016)
Это может быть поведение RxJava, но я не уверен в Swift. Reactivex.io просто говорит, что мы не должны вызывать subscribeOn
несколько раз.
Я обычно оборачиваю операции в Observable<Void>
, и их нужно запускать в разных потоках ... Вот почему я спрашиваю, как обеспечить выполнение наблюдаемого кода в потоке, для которого я его указал. subscribeOn
не сработает, потому что я могу объединить наблюдаемое.
Я хочу, чтобы поток, в котором он должен выполняться, был инкапсулирован в мое определение Observable, а не выше в цепочке.
Лучше всего сделать следующее:
- Начните с Observable.empty, используя тип данных, который я хочу использовать.
- Используйте
observeOn
, чтобы принудительно запустить поток, в котором я хочу, чтобы он выполнялся. - Свяжите его с фактическим Observable, который я хочу использовать.
Редактировать
Я прочитал
subscribeOn
иobserveOn
документацию на reactivex.io.Я знаком с тем, как переключаться между потоками с помощью
subscribeOn
иobserveOn
.Что меня особенно беспокоит, так это сложность использования
subscribeOn
при конкатенации или объединении наблюдаемых последовательностей.Проблема в том, что наблюдаемые объекты должны запускаться специально в одном потоке, И они не знают, где и с кем они будут связаны. Поскольку я точно знаю, в каком потоке они должны работать, я бы предпочел инкапсулировать определение планировщика в определении наблюдаемого, а не при связывании последовательности.
subscribeOn
и возможные рекомендуемые передовые методы, обеспечивающие выполнение конкатенированногоObservable<Void>.create()
в определенном потоке. - person dsapalo   schedule 07.02.2017