1

Beim Lernen von RX bin ich auf die Frage gestoßen, wie man die Architektur gestaltet, wenn es um die UI geht.Rx in der MVC-Architektur

Der Anwendungsfall: Button klicken -> Geschäfts Aktionen ausführen (download & Parse-Webseite) -> Ansicht aktualisieren

Ich sehe zwei einfache Ansätze:

  1. build beobachtbare die UI-Ereignisse enthält, dann transformiere es mit map(), abonniere die Ansicht dazu.

  2. Build Observable enthält die UI-Ereignisse, bauen die zweite Observable enthält die Antworten, verknüpfen Sie die beiden Observablen (zipWith), schließlich abonnieren Sie die Ansicht dazu.

Im ersten Ansatz, meine Business-Logik mehr oder weniger Function<INPUT, OUTPUT> in einigen Funktionen implementiert. In meinem Anwendungsfall lade ich die Webseite herunter und analysiere sie dann. Dann würde meine Geschäfts-/Service-Methode wie aussehen:

Observable<Event> getEventsFromWeb(Observable<Click> clicks) { 
    return clicks.map(downloadWebPage()).map(parseWebPage(parser)); } 

Im zweiten Ansatz, meine Business/Service-Methode bekommt direkt Ergebnis, das ich brauche.

Observable<Event> getEventsFromWeb() { 
    return Observble.create(/*download web page*/).map(parseWebPage(parser)); } 

Dann muss ich die die getEventsFromWeb verknüpfen() beobachtbar die UI beobachtbaren klickt, so dass die Aktion tatsächlich durch UI ausgelöst wird.

clicks.zipWith(getEventsFromWeb(), (click, Events) -> Events)) 

Jetzt bin ich nicht sicher, welche dieser beiden (oder andere) besser mit RX zu verwenden ist. Ich mag die erste Art, weil eine einfache Transformation des Streams mit map() ist, aber der Dienst benötigt den zusätzlichen Parameter (zusätzliche Kopplung). Der zweite Ansatz hat nicht die zusätzliche Kopplung (Methodenparameter), so ist es flexibler, es ist klarer, was passiert (der zusätzliche Parameter scheint seltsam zu sein), ich denke, es kann besser getestet werden, aber ich bin nicht sicher, ob zipWith() die Verbindung zu den UI-Ereignissen herstellt.

Was denkst du? Gibt es bessere Ansätze, um das Modell mit den UI-Ereignissen zu verknüpfen?

+0

statt 'clicks.zipWith (getEventsFromWeb(), (klicken, Ereignisse) -> Veranstaltungen))' ich tun kann 'clicks.flatMap ((e) -> getEventsFromWeb()) 'das sieht viel besser aus – Blitzkr1eg

Antwort