An iOS application built with UIKit, following Clean Architecture, MVVM, and Coordinators, with manual Dependency Injection.
Implements a type-safe Moya networking layer, image caching, pagination, and MapKit integration — structured for scalability, maintainability, and testability.
This app fetches and displays users from the Random User API:
- User List – Paginated table view of users with name, email, and avatar.
- Image Loading & Caching – Async image loading with
NSCache
-based memory caching and request cancelation. - Pagination – Automatic load-more when reaching the list end.
- User Details – Displays larger avatar, name, and map location.
- Coordinate Validation – Only valid coordinates are shown on the map.
This project reflects real-world architecture used in production, with clear separation of concerns, high test coverage, and easy extensibility.
- UIKit – Interface and navigation
- MVVM – Separation of UI and business logic
- Coordinators – Scene-based navigation orchestration
- Manual Dependency Injection – Lightweight, explicit DI without frameworks
- Moya – Networking layer (DTO → Domain mapping)
- MapKit – Map rendering
- NSCache – Image caching
- XCTest & XCUITest – Unit, integration, and UI testing
Clean-MVVM-C/
├── Application/ # AppDelegate, AppCoordinator, AppDIContainer
├── Presentation/ # ViewControllers, ViewModels, Coordinators
├── Domain/ # Entities, UseCases, Repository Interfaces
├── Data/ # Repository Implementations, API DTOs, Services
├── Infrastructure/ # Networking layer
├── Resources/ # Assets, Constants
├── Tests/ # Unit, Integration & UI tests
User List Screen | User Details Screen |
---|---|
![]() |
![]() |
This project can be used as a reference or starting point if you want to:
- Build a UIKit app with Clean Architecture separation.
- Implement MVVM and Coordinators in a practical way.
- Work with a type-safe Moya networking layer.
- Apply manual dependency injection in a real project.
- Add image caching with request cancelation.
- Write UI, integration, and unit tests for a real app flow.
git clone https://github.com/gormartirosyan/Clean-MVVM-C.git
cd Clean-MVVM-C
pod install
open Clean-MVVM-C.xcworkspace
Run with ⌘R
.
Run tests with ⌘U
.
Gor Martirosyan – iOS Developer
@gormartirosyan
Licensed under the MIT License.