{"id":13568904,"url":"https://github.com/kudoleh/iOS-Clean-Architecture-MVVM","last_synced_at":"2025-04-04T05:30:48.632Z","repository":{"id":37841877,"uuid":"203359838","full_name":"kudoleh/iOS-Clean-Architecture-MVVM","owner":"kudoleh","description":"Template iOS app using Clean Architecture and MVVM. Includes DIContainer, FlowCoordinator, DTO, Response Caching and one of the views in SwiftUI ","archived":false,"fork":false,"pushed_at":"2024-03-17T08:20:59.000Z","size":2542,"stargazers_count":3924,"open_issues_count":5,"forks_count":674,"subscribers_count":61,"default_branch":"master","last_synced_at":"2024-10-29T15:30:36.696Z","etag":null,"topics":["architecture","clean-architecture","ios-swift","mvvm","mvvm-architecture","mvvm-ios","swiftui","viewmodel","viewmodels","xcode"],"latest_commit_sha":null,"homepage":"https://tech.olx.com/clean-architecture-and-mvvm-on-ios-c9d167d9f5b3","language":"Swift","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/kudoleh.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null}},"created_at":"2019-08-20T11:11:19.000Z","updated_at":"2024-10-27T21:30:41.000Z","dependencies_parsed_at":"2023-09-30T00:41:53.077Z","dependency_job_id":null,"html_url":"https://github.com/kudoleh/iOS-Clean-Architecture-MVVM","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kudoleh%2FiOS-Clean-Architecture-MVVM","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kudoleh%2FiOS-Clean-Architecture-MVVM/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kudoleh%2FiOS-Clean-Architecture-MVVM/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kudoleh%2FiOS-Clean-Architecture-MVVM/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/kudoleh","download_url":"https://codeload.github.com/kudoleh/iOS-Clean-Architecture-MVVM/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":223059721,"owners_count":17081246,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["architecture","clean-architecture","ios-swift","mvvm","mvvm-architecture","mvvm-ios","swiftui","viewmodel","viewmodels","xcode"],"created_at":"2024-08-01T14:00:33.163Z","updated_at":"2024-11-05T01:31:14.799Z","avatar_url":"https://github.com/kudoleh.png","language":"Swift","funding_links":[],"categories":["Swift","Sample","🏗️ Architecture Patterns"],"sub_categories":["RSS","MVVM (Model-View-ViewModel)"],"readme":"\n# Template iOS App using Clean Architecture and MVVM\n\niOS Project implemented with Clean Layered Architecture and MVVM. (Can be used as Template project by replacing item name “Movie”). **More information in medium post**: \u003ca href=\"https://tech.olx.com/clean-architecture-and-mvvm-on-ios-c9d167d9f5b3\"\u003eMedium Post about Clean Architecture + MVVM\u003c/a\u003e\n\n\n![Alt text](README_FILES/CleanArchitecture+MVVM.png?raw=true \"Clean Architecture Layers\")\n\n## Layers\n* **Domain Layer** = Entities + Use Cases + Repositories Interfaces\n* **Data Repositories Layer** = Repositories Implementations + API (Network) + Persistence DB\n* **Presentation Layer (MVVM)** = ViewModels + Views\n\n### Dependency Direction\n![Alt text](README_FILES/CleanArchitectureDependencies.png?raw=true \"Modules Dependencies\")\n\n**Note:** **Domain Layer** should not include anything from other layers(e.g Presentation — UIKit or SwiftUI or Data Layer — Mapping Codable)\n\n## Architecture concepts used here\n* Clean Architecture https://blog.cleancoder.com/uncle-bob/2012/08/13/the-clean-architecture.html\n* Advanced iOS App Architecture https://www.raywenderlich.com/8477-introducing-advanced-ios-app-architecture\n* [MVVM](ExampleMVVM/Presentation/MoviesScene/MoviesQueriesList) \n* Data Binding using [Observable](ExampleMVVM/Presentation/Utils/Observable.swift) without 3rd party libraries \n* [Dependency Injection](ExampleMVVM/Application/DIContainer/AppDIContainer.swift)\n* [Flow Coordinator](ExampleMVVM/Presentation/MoviesScene/Flows/MoviesSearchFlowCoordinator.swift)\n* [Data Transfer Object (DTO)](https://github.com/kudoleh/iOS-Clean-Architecture-MVVM/blob/master/ExampleMVVM/Data/Network/DataMapping/MoviesResponseDTO%2BMapping.swift)\n* [Response Data Caching](https://github.com/kudoleh/iOS-Clean-Architecture-MVVM/blob/master/ExampleMVVM/Data/Repositories/DefaultMoviesRepository.swift)\n* [ViewController Lifecycle Behavior](https://github.com/kudoleh/iOS-Clean-Architecture-MVVM/blob/3c47e8a4b9ae5dfce36f746242d1f40b6829079d/ExampleMVVM/Presentation/Utils/Extensions/UIViewController%2BAddBehaviors.swift#L7)\n* [SwiftUI and UIKit view](ExampleMVVM/Presentation/MoviesScene/MoviesQueriesList/View/SwiftUI/MoviesQueryListView.swift) implementations by reusing same [ViewModel](ExampleMVVM/Presentation/MoviesScene/MoviesQueriesList/ViewModel/MoviesQueryListViewModel.swift) (at least Xcode 11 required)\n* Error handling examples: in [ViewModel](https://github.com/kudoleh/iOS-Clean-Architecture-MVVM/blob/201de7759e2d5634e3bb4b5ad524c4242c62b306/ExampleMVVM/Presentation/MoviesScene/MoviesList/ViewModel/MoviesListViewModel.swift#L116), in [Networking](https://github.com/kudoleh/iOS-Clean-Architecture-MVVM/blob/201de7759e2d5634e3bb4b5ad524c4242c62b306/ExampleMVVM/Infrastructure/Network/NetworkService.swift#L84)\n* CI Pipeline ([Travis CI + Fastlane](.travis.yml))\n \n## Includes\n* Pagination\n* Unit Tests for Use Cases(Domain Layer), ViewModels(Presentation Layer), NetworkService(Infrastructure Layer)\n* Dark Mode\n* Size Classes and UIStackView in Detail view\n* SwiftUI example, demostration that presentation layer does not change, only UI (at least Xcode 11 required)\n\n## Networking\nIf you would like to reuse Networking from this example project as repository I made it availabe [here](https://github.com/kudoleh/SENetworking)\n\n## Views in Code vs Storyboard\nThis repository uses Storyboards (except one view written in SwiftUI). There is another similar repository but instead of using Storyboards, all Views are written in Code. \nIt also uses UITableViewDiffableDataSource:\n[iOS-Clean-Architecture-MVVM-Views-In-Code](https://github.com/kudoleh/iOS-Clean-Architecture-MVVM-Views-In-Code)\n\n## How to use app\nTo search a movie, write a name of a movie inside searchbar and hit search button. There are two network calls: request movies and request poster images. Every successful search query is stored persistently.\n\n\nhttps://user-images.githubusercontent.com/6785311/236615779-153ef846-ae0b-4ce8-908a-57fca7158b9d.mp4\n\n\n## Requirements\n* Xcode Version 11.2.1+  Swift 5.0+\n\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fkudoleh%2FiOS-Clean-Architecture-MVVM","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fkudoleh%2FiOS-Clean-Architecture-MVVM","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fkudoleh%2FiOS-Clean-Architecture-MVVM/lists"}