Questa è una soluzione proposta per una CodeChallenge riguardante un app che mostri una lista di Pokemon con immagine e nome. Alla selezione della cella, l'app deve mostrare un dettaglio contenente nome, immagini, stats e typology del Pokemon in questione. Le api sono pubbliche a questo indirizzo: https://pokeapi.co
questi i requirements:
- Target SDK iOS 11
- Meno librerie possibili
- Ui dinamica con supporto per iPhone/iPad e questi bonus:
- funzionamento offilne
- unit tests
- aggiungere funzionalità utili
La struttura scelta prevede una architettura MVVM + Coordinator. Non avendo esperienza diretta con reactive, ma volendo comunque seguire MVVM, ho ripiegato sull'utilizzo delle closures per implementare aggiornamenti asincroni. Sono presenti UnitTest per i vari componenti contenente logica. E' stato previsto il funzionamento offline, e implementata la paginazione.
L'app è molto semplice. le schermate sono due
- lista di Pokemon
- dettaglio dei un Pokemon
Il Coordinator e responsabile per la navigazione. Ogni schermata prevede la suddivisione tipica dell'architettura MVVM con ViewModel e ViewController. L’accesso ai dati e gestito dal repository, il quale contiene la logica che gestisce cache e network. I vari componenti sono indipendenti e progettati tramite protocols e dependency injection, in modo da assicurare la testabilità della logica tramite mock ad ogni livello.
La cache, puramente per una questione di tempistiche, e stata implementata con l'utilizzo di UserDefaults. Che non è ideale. In ogni caso, essendo progettata e implementata attraverso un protocollo, risulta facile sostituire l’implementazione concreta con qualsiasi altro data layer. In assenza di requirements specifici, il repository prende sempre i dati dalla cache e se non trova nulla, va sul network.
Target SDK 11.0. Sviluppato su Xcode 11.3.
Non essendoci nessuna dipendenza e gestore di dipendenze, è sufficiente aprire il progetto ed eseguire l'app
Daniele99999999
PokemonDirectory è disponibile con la licenza MIT. Vedere il file LICENSE per maggiori informazioni