Отвечает за сборку модуля. В нем создаются необходимые сущности и проставляются зависимости.
Представляет собой описание объектов для передачи данных (DTO - Data Transfer Objects) в рамках одного варианта использования (UseCase). Состоит из:
- Request - структура для передачи данных из ViewController в Interactor
- Response - структура для передачи данных из Interactor в Presenter
- ViewModel - структура для передачи данных из Presenter во ViewController Структуры Request, Response, ViewModel, объявляются внутри enum с наименованием модуля для выделенного пространства имен. DataFlow должен четко описывать бизнес задачи и давать наглядную информацию о передаваемых данных внутри модуля.
Содержит бизнес логику модуля. Нежелательно заставлять Interator ходить в сеть, обращаться к базе данных и т.д. Он выступает агрегатором бизнес логики. Так, например, для получения данных он обращается к Provider, к различным Worker'ам для выполнения каких-либо действий с данными, после чего передает подготовленные данные дальше в Presenter и т.д. Interactor получает запрос на операцию над данными от ViewController с помощью Request и предает данные в Presenter с помощью Response.
Реализует переиспользуемую часть бизнес логики (например: алгоритм фильтрации данных).
Содержит логику подготовки данных для отображения (например: форматирование данных (номера телефона, суммы), локализация и т.д.) и передает их во ViewController посредством ViewModel.
Отвечает за отображение состояния, полученого от Presenter и взаимодействует с пользователем. ViewController содержит в себе только одну view, которая создается в методе loadView(). Он не управляет расположением view. Вся необходимая верстка уже должна быть в отдельно реализованной view. Однако ViewController выступает делегатом для всего view слоя. Так он знает, когда изменился текст в TextField или пользователь нажал на ячейку.
override func loadView() {
view = CatalogListView(delegate: self)
}Абстракция отвечающая за доступ к данным. Инкапсулирует в себе обращение к Service для получения данных из сети (или других источников) и/или DataStore, если данные должны кэшироваться.
Объект абстрагирующий долгосрочное хранение данных.
class CatalogDataStore {
static let shared = CatalogDataStore()
var catalogModels: [CatalogObjectType: [CatalogModel]] = [:]
}Содержит в себе полностью подготовленные для отображения данные для View (каждой отдельной subview). ViewModel — это DTO и не содержит в себе никакой логики.
Для передачи данных между модулями A и B требуется указать id передаваемой модели. Модуль B должен сам обратиться к общему хранилищу и получить требуемую модель. Нежелательно передавать данные из одного модуля в другой напрямую.