Ich entwickle iOS-Anwendungen mit dem Model View ViewModel-Paradigma, um meine View-Controller zu strukturieren und ihre Daten zu repräsentieren. In Verbindung mit ReactiveCocoa ist dies ein mächtiges Werkzeug. View-Controller werden weniger aufgebläht, View-Modelle sind einfacher zu testen, und es gibt eine klare Trennung von Bedenken.
Das einzige Problem, das ich mit dieser speziellen Architektur habe, ist, dass es wie bei MVC immer noch keinen klaren Ort und keine Möglichkeit gibt, Netzwerkcode zu strukturieren. Nehmen Sie das folgende triviale Beispiel:
%Vor%Dann in meiner Sicht Controller kann ich irgendwo tun:
%Vor%Für mich ist es so, als ob der ganze Sinn von MVVM darin besteht, die Ansichten und den View-Controller (was ich die Ansichts-Darstellungsschicht nenne) nicht irgendeinem Netzwerkcode auszusetzen, aber ich brauche immer noch eine Möglichkeit, das zu beobachten Inhalt wurde abgerufen, ohne die Einzelheiten zu kennen, nur dass ein erfolgreicher Abruf stattgefunden hat. Ich könnte mir vorstellen, dass das ungefähr so aussieht:
%Vor% Gleichzeitig möchte ich auch nicht die Fähigkeit verlieren, Signale zu binden und Produzenten auf veränderliche Eigenschaften auf meiner Verwendung von <~
zu signalisieren.
Diese Methode ist ein wenig besser, aber es verwendet immer noch Nebenwirkungen, um ein nächstes Ereignis auf dem Signalbeobachter zu senden. Wenn Sie eine gemeinsame ViewModel
Basisklasse verwenden, müssen Sie diesen Beobachter diesen Unterklassen zugänglich machen kann es benutzen.
Ich suche nach Verbesserungen, die an der MVVM-Architektur vorgenommen werden können, entweder Änderungen an der Architektur selbst, so dass es nicht mehr MVVM ist, und die bessere und allgemeinere Vernetzung oder sogar eine Art generisches Basisprotokoll für Sehen Sie sich Modelle an, die den gesamten Prozess abstrahieren.
Für mich ist es wichtig, so allgemein wie möglich zu sein und gleichzeitig so wenig Informationen wie möglich über das Ansichtsmodell zu geben. Im Idealfall möchte ich, dass jeder View-Controller genau so mit dem Ansichtsmodell interagiert, wie das Netzwerk funktioniert.
BEARBEITEN:
Per @ lonuts Vorschlag habe ich einen Teil des Netzwerkcodes in meine Modellklassen verschoben, aber nur als statische Methoden:
%Vor%Auf diese Weise können Modelle Netzwerkaufrufe nach Belieben implementieren, was den Vorteil hat, dass die Implementierungsdetails wie bestimmte Moya-Netzwerkaufrufe, die Zuordnung von Antwortobjekten, etc. entfernt werden.
Stellen Sie sich vor, Sie haben ein User
-Modell:
Es löst nicht vollständig das Problem, wie der View-Controller und das View-Modell miteinander interagieren sollten, aber es verschiebt definitiv den Netzwerk-Code zu einem einzigen Fehlerpunkt.
Ich bin nicht sehr fortgeschritten in der Verwendung von MVVM oder RAC, aber von dem, was ich mit dem Netzwerkcode gespielt habe, sollte im Modellteil sein, dann gibt es eine Methode, die die Ergebnisse im Ansichtsmodellteil beobachtet (etwas wie "fetchPosts () ") und im View-Teil wird die fetchPosts-Methode aufgerufen. Ich empfehle Ihnen diesen Blogbeitrag für viel mehr Informationen.
Tags und Links mvvm ios architecture swift network-programming