MovieApp é um aplicativo que utiliza a API do TMDb (The Movies Database) para listar os filmes mais bem avaliados no momento. O projeto foi criado como base de estudo para a linguagem Swift e o framework UIKit, utilizando boas práticas e tecnologias comuns do desenvolvimento iOS. Sendo assim, seu foco não era trazer funcionalidades muito complexas.
Funcionalidades:
- Listar Filmes
- Detalhar Filme
- Favoritar Filme
O projeto foi estruturado com base na Clean Architecture, separado em 4 diferentes camadas:
- Domain: Regras de Negócio
- Data: Responsável por controlar os dados da aplicação, como chamadas para API, cache, memória, etc.
- Presentation: Gerenciamento de estado(MVVM) e controle das informações que serão apresentadas na View
- Main: Aplicação iOS (UIKit, SwiftUI)
Como eram poucas funcionalidades, decidi estruturar a aplicação utilizando a abordagem de Layer First, ou seja, dividindo cada camada em um módulo diferente. A estratégia que adotei para a separação em módulos, foi utilizando os Targets do Xcode, e separando cada módulo como um framework independente.
Main e Presentation
Foi utilizado o framework UIKit para o desenvolvimento das interfaces gráficas, empregando tanto a abordagem de Xibs e de ViewCode. Para gerenciar o estado da aplicação, adotei o padrão arquitetural MVVM, utilizando a biblioteca RxSwift para estabelecer a vinculação entre as ViewModels e as ViewControllers.
O controle das rotas na aplicação foi implementado de acordo com o padrão Coordinator, juntamente com a biblioteca Swinject para o gerenciamento das dependências de cada ViewController.
Data
Para a gestão dos dados da aplicação, foi implementado Repositórios que gerenciam tanto da camada Remota quanto a camada de Cache.
Para as requisições HTTP, foi adotado a biblioteca Moya, que oferece uma abstração em relação ao conhecido Alamofire.
Já para o armazenamento em cache, que consistiam em informações simples, foi utilizado o UserDefaults.
Domain
Na camada de domínio, foram implementados todos os modelos e casos de uso relacionados às regras de negócio. Além disso, foram definidos protocolos (Repositórios) que devem ser implementados pela camada de dados.
Em todos os módulos da aplicação foi utilizada a biblioteca RxSwift, e como padrão de retorno dos métodos foi utilizado Observables, Single e Completable
Ferramentas utilizadas:
- UIKit
- RxSwift
- Swinject
- Moya
- Kingfisher
- Cuckoo (Teste Unitário)
- SwiftyUserDefaults