Раздел Планирование и потоки в Intro to Rx говорит, что
использование SubscribeOn и ObserveOn должно быть вызвано только последним подписчиком
В нем также говорится, что в приложении пользовательского интерфейса должен отображаться уровень представления, который обычно является конечным подписчиком, для вызова этих методов.
Мне интересно, уверен ли совет, так как я вижу ситуации, в которых это не удобно:
- Во-первых, я не считаю, что слой презентации должен решить, где должен быть подписан Observable, исходящий из уровня данных. На мой взгляд, уровень представления должен быть незнающим, если данные поступают из базы данных, из REST API или из памяти. По этой причине удобно, чтобы слой данных вызывал
subscribeOn()
перед возвратом Observable, передавая планировщик IO или непосредственный планировщик как удобный. - Если уровень представления получает Observable из какой-либо службы или используемого случая (который, в свою очередь, получает ее из уровня данных), и эта служба решает, что ей необходимо обработать поток в некоторых планировщиках вычислений, почему слой презентации должен заботиться о это?
- Как насчет потока, который изначально выходит из пользовательского интерфейса, поэтому его необходимо подписывать в потоке пользовательского интерфейса. Затем он будет отправлен на какую-то службу, чтобы выполнить некоторую работу, и, наконец, вернуться к уровню представления, который будет наблюдаться в потоке пользовательского интерфейса. Для этого потребуется, чтобы поток пользовательского интерфейса был
subscribeOn()
планировщик пользовательского интерфейса, затемobserveOn()
какой-либо другой планировщик и, наконец,observeOn()
планировщик пользовательского интерфейса. В этом случае возможность вызоваsubscribeOn()
иobserveOn()
только в конечном подписчике означает, что поток может обрабатываться только в потоке пользовательского интерфейса.
Есть ли какая-то веская причина, почему я должен пожертвовать архитектурой моего приложения и игнорировать способность Rx легко переключать потоки, вызывая эти два метода только конечным подписчиком?