Próbuję wdrożyć Clean Architecture opisany przez Roberta Martina. Dokładniej używam wersji VIPER, która jest wersją Clean Architecture dla systemu iOS.Czysta architektura - Robert Martin - Jak podłączyć przypadki użycia
Mam problem jest następujący:
Użytkownik uruchamia patrząc na mapę z miejscami (PIN) na nim. Jeśli kliknie przycisk, pinezka zostanie upuszczona i zostanie przeniesiony do innego widoku, aby utworzyć (lub edytować, jeśli było to kliknięcie w istniejącą szpilkę) miejsce (lub anulować). W tym innym widoku użytkownik może edytować informacje o miejscu, a następnie kliknąć "Wstecz" lub "Gotowe" (lub "Edytuj"). Po kliknięciu "done", PlaceDetailsViewController wysyła wiadomość do PlaceDetailsPresenter z informacjami o miejscu, a PlaceDetailsPresenter używa CreatePlaceInteractor do utworzenia miejsca. Ten interactor zwraca identyfikator GUID, który służy do identyfikacji miejsca.
Jeśli użytkownik kliknie z powrotem przed utworzeniem miejsca, wraca do mapy, a upuszczona szpilka podnosi się i odchodzi (ponieważ nie ma identyfikatora GUID, jest to nowe miejsce i znika). Jeśli kliknie z powrotem po utworzeniu, pin pozostanie tam (ponieważ powinien mieć identyfikator GUID).
W jaki sposób należy połączyć to wszystko i gdzie należy przechowywać informacje o miejscu (w tym identyfikator GUID)? Aby wyjaśnić nieco więcej:
- Kto powinien poinformować MapPresenter, że pin pozostanie tam lub znika? Czy to jest PlaceDetailsPresenter, czy powinienem przekazać te informacje do PlaceDetailsWireframe -> MapWireframe -> MapPresenter -> MapView?
- Przed powrotem, gdzie powinien być przechowywany ten identyfikator GUID, w PlaceDetailsPresenter lub PlaceDetailsViewController?
Teraz to co mam:
EDIT:
Zasadniczo Myślę, że problemem jest to, że VIPER pochodzi Roberta Martina Clean Architektury i on pochodzi z internetowego (Rails) tle, więc nie myśli dużo o stanie (lub nie precyzuje go w swoich rozmowach).
Co jest głównie moim pytaniem, gdzie powinien być przechowywany stan, w jaki sposób powinny komunikować się różne moduły, czy powinien to być obiekt Wireframe, czy poprzez bazę danych, lub przez interakcje, lub poprzez Presenterów komunikujących się ze sobą jak tutaj https://github.com/objcio/issue-13-viper-swift.
Właśnie rozpoczynam pracę z VIPER, ale nie mogę mieć prezenterów, którzy wiedzą o sobie nawzajem. Preferuję moduły komunikujące się ze sobą za pośrednictwem Wireframe/Routera. Cieszę się, że poprawiono mnie tutaj, ponieważ wciąż uczę się tej architektury. – bennythemink
Mam tendencję do myślenia tak samo jak ty, chociaż nadal nie znalazłem decydującej odpowiedzi na to, jak przekazywać informacje między nimi, czy lepiej przekazywać struktury danych za pomocą modelu szkieletowego (2 opcje tutaj, używaj zawsze tego samego, dużego, struktury danych lub ciągle się zmieniaj, aby przekazać tylko minimalną ilość potrzebnych informacji (co kończy się tworzeniem większej liczby klas, które nie mogą być ponownie wykorzystane)) lub zapisać stan w Interaktorach i użyć ich do pobrania informacji w drugim prezenterze. Wysłałem kolejne pytanie dotyczące stackoverflow, które wyjaśnia, co rozumiem przez dużą strukturę danych, ale po prostu nie mogłem go jeszcze znaleźć. –
http://stackoverflow.com/questions/29054526/viper- mógłby-interactor-return-nie-potrzebna-informacja –