При изучении RX я столкнулся с вопросом о том, как проектировать архитектуру, когда задействован пользовательский интерфейс.Rx в архитектуре MVC
Прецедент: нажмите кнопку -> выполнять бизнес-действия (скачать & синтаксического анализа веб-страницы) -> Просмотр обновление
Я вижу две простые подходы:
сборки Observable, содержащий события пользовательского интерфейса, а затем преобразуйте его с помощью map(), наконец, подпишитесь на него.
build Наблюдаемый, содержащий события пользовательского интерфейса, создайте второе Наблюдаемое, содержащее ответы, свяжите два наблюдаемых (zipWith), наконец, подпишитесь на него.
В 1-ом подходе, мой бизнес-логика более или менее реализованы в некоторых функциях Function<INPUT, OUTPUT>
. В моем случае использования я загружаю веб-страницу, а затем разбираю ее. Тогда мой бизнес/метод обслуживания будет выглядеть так:
Observable<Event> getEventsFromWeb(Observable<Click> clicks) {
return clicks.map(downloadWebPage()).map(parseWebPage(parser)); }
Во втором подходе мой бизнес/метод обслуживания получает непосредственно результат, который мне нужен.
Observable<Event> getEventsFromWeb() {
return Observble.create(/*download web page*/).map(parseWebPage(parser)); }
Тогда я должен связать с getEventsFromWeb() Observable к UI щелкает наблюдаемой, так что действие на самом деле вызвано UI.
clicks.zipWith(getEventsFromWeb(), (click, Events) -> Events))
Теперь я не уверен, какой из этих двух (или других) лучше использовать с RX. Я вроде как первый, потому что это простое преобразование потока с map(), но для обслуживания нужен дополнительный параметр (дополнительная связь).
Второй подход не имеет дополнительной связи (параметр метода), поэтому он более гибкий, более ясно, что происходит (дополнительный параметр кажется странным), я думаю, что он может быть проверен лучше, но im не уверен, что zipWith() - это способ связать его с событиями пользовательского интерфейса.
Как вы думаете? Существуют ли какие-либо более эффективные подходы к связыванию модели с событиями пользовательского интерфейса?
вместо 'clicks.zipWith (getEventsFromWeb() (нажмите, события) -> События))' я могу сделать 'clicks.flatMap ((е) -> getEventsFromWeb()) ', который выглядит лучше – Blitzkr1eg