Example iOS app designed using MVVM-C and Clean Architecture. Uses Swift Concurrency.
The app retrieves images for any search query or tag via the Flickr API. It has three modules: ImageSearch, ImageDetails, HotTags.
- Clean Architecture
- Explicit Architecture
- MVVM
- Flow coordinator implemented with closure-based actions
- Dependency Injection, DIContainer
- Protocol-Oriented Programming
- Data Binding using the lightweight Observable<T>
- Closure-based delegation using the lightweight Event<T>
- Pure functional transformations
- Delegating entity behavior
- Alternative DTO approach
- Reusable and universal NetworkService based on URLSession
- Reusable and universal SQLite wrapper around SQLite3
- Image caching service
- Advanced error handling
- Unit and integration tests for a number of components from all layers
Presentation (MVVM): coordinators, UI elements, SwiftUI views, UIKit storyboards, ViewControllers, ViewModels
Domain: entities, use cases, services, interfaces (for use cases, services and repositories)
Data: entity repositories, APIs, API/DB interactors (or network services and storages), adapters
ImageSearch module:
* searchImagesUseCase.execute(imageQuery)
* imageCachingService.cacheIfNecessary(data)
* imageCachingService.getCachedImages(searchId: searchId)
ImageDetails module:
* getBigImageUseCase.execute(for: image)
HotTags module:
* getHotTagsUseCase.execute()
ImageCachingService implements the logic for caching downloaded images and freeing memory. This helps keep the app's memory usage under control, since there can be a lot of downloaded images, and without caching, the app could quickly accumulate hundreds of MB of memory used. Downloaded images are cached and read from the cache automatically.
- SwiftEvents - the easiest way to implement data binding and notifications. Includes Event<T> and Observable<T>. Has a thread-safe version.
- URLSessionAdapter - a Codable wrapper around URLSession for networking
- SQLiteAdapter - a simple wrapper around SQLite3
iOS version support: 15.0+. Xcode 13.0+, Swift 5.5+