1

При изучении RX я столкнулся с вопросом о том, как проектировать архитектуру, когда задействован пользовательский интерфейс.Rx в архитектуре MVC

Прецедент: нажмите кнопку -> выполнять бизнес-действия (скачать & синтаксического анализа веб-страницы) -> Просмотр обновление

Я вижу две простые подходы:

  1. сборки Observable, содержащий события пользовательского интерфейса, а затем преобразуйте его с помощью map(), наконец, подпишитесь на него.

  2. 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() - это способ связать его с событиями пользовательского интерфейса.

Как вы думаете? Существуют ли какие-либо более эффективные подходы к связыванию модели с событиями пользовательского интерфейса?

+0

вместо 'clicks.zipWith (getEventsFromWeb() (нажмите, события) -> События))' я могу сделать 'clicks.flatMap ((е) -> getEventsFromWeb()) ', который выглядит лучше – Blitzkr1eg

ответ