Skip to content

Example iOS app designed using MVVM-C and Clean Architecture. Uses Swift Concurrency.

License

Notifications You must be signed in to change notification settings

denissimon/iOS-MVVM-Clean-Architecture

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

iOS-MVVM-Clean-Architecture

Swift Version Platforms License: MIT

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.

Architecture concepts used here

Includes

  • 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

Main 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

Use case scenarios

ImageSearch module:

* searchImagesUseCase.execute(imageQuery)
* imageCachingService.cacheIfNecessary(data)
* imageCachingService.getCachedImages(searchId: searchId)

ImageDetails module:

* getBigImageUseCase.execute(for: image)

HotTags module:

* getHotTagsUseCase.execute()

Image caching service

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.

Reusable components from this project

  • 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

Requirements

iOS version support: 15.0+. Xcode 13.0+, Swift 5.5+