A simple yet clean Movie Listing iOS application built with Swift, using UIKit - SwiftUI and ** Clean Architecture (MVVM) with Coordinator pattern**. It integrates with the TMDB API to fetch and display movie data and allows users to mark movies as favorites using Core Data for local persistence.
- β Fetch and display a list of popular movies from TMDB.
- π Each movie item in the list shows:
- Title
- Release date
- Rating (average vote)
- Vote count
- Favorite button (toggle and persist)
- π Tap on a movie to view a detail screen showing:
- Movie poster
- Release date
- Original language
- Full description (overview)
- π Network calls are handled using async/await with Combine for reactivity.
- π¦ Offline Support:
- Popular movies are cached locally to allow viewing without internet.
- Uses
User Defaultto persist movie lists and details. - App automatically falls back to cached data when offline.
The app is structured using Clean Architecture (MVVM) with the Coordinator pattern to handle navigation and separation of concerns.
- UIKit: Interface and view building.
- SwiftUI: Declarative UI framework for building modern, reactive user interfaces across all Apple platforms.
- MVVM: architecture for separation of UI and business logic.
- Clean Architecture: Layered architecture to separate concerns and promote testability, scalability, and maintainability.
- Coordinator Pattern: For decoupling navigation logic.
- Combine: For reactive data binding and state management.
- Async/Await: For modern and clean asynchronous code.
- Combine (built-in)
- TMDB REST API (via URLSession)
| Movie List | Movie Details |
|---|---|
![]() |
![]() |
-
Clone the repository:
git clone https://github.com/iOSMahmoudSaad/QPN_Task.git
-
Open the
.xcodeprojor.xcworkspacefile. -
Insert your TMDB API key in the appropriate configuration (usually in a
Secrets.plistor constant file):let apiKey = "YOUR_TMDB_API_KEY"
-
Build and run on simulator or real device.
- Search functionality.
- Add Favourite Screen .
Mahmoud Saad iOS Engineer Feel free to reach out on LinkedIn

