- Home view: Shows list of movies could be filtered by popular or top rated by a segment
- Movie details view: Shows details of a movie including the overview, genres and posters.
- Pagination for movie lists
- Memory caching for filtering: No extra requests are sent to backend when filter is changed if data already exists in memory.
- Architecture: MVVM, protocol oriented, covering SOLID principles, inversion of control (dependency injection via protocols instead of concerete types), error handlings.
- Unit Test demonstration for movie details view model
- UI Test demonstration
- Due to my UI/UX design experience we have discussed earlier, I used my budget for both tech and design parts to demonstrate both.
- Due to simplicity of the requirements no complex or advanced networking is been implemented and the shared
URLSessionhas been used. Usually I go with using Almofire which was an overkill for this project. - For the binding between view and viewmodel I have used clousures.
- There is no coordinator implemeted since there is very few navigations in the project.
- Dependency Injection: Please check the view models where there API services are injected as protocols instead of concerete types. So we can easily create fakes for our unit testing purposes.
- I have put a few unit tests to just demonstrate the testability of the the view models but in a real project full unit test coverage for view models is preffered.
- I have put a few UI tests to just demonstrate it but due to shortage of time I did not use mocked data and am testing against real data which should definitely be changed, thus I have put a TODO in code instead of putting more time than the budget.
- I have used storyboard and XIB for creating the most of UI parts but have also created the
LoadingViewprogrammatically to just demonstrate the preffered way of creating UIs for biggers teams to avoid conflicts.
- Due to simplicity of the requirements no complex or advanced networking is been implemented and the shared
Clone the repo and open TheMovieDB.xcodeproj.
