Создать панель запуска
В этом пошаговом руководстве мы узнаем, как использовать шаблон чистой архитектуры VIP для разработки приложений для платформ Apple.
Мы разработаем приложение Clean SpaceX, в котором будем демонстрировать информацию о ракетах, которые были изготовлены и с которыми проводились эксперименты SpaceX.
Что такое VIP?
По сравнению с MVVM, MVC или VIPER архитектурный шаблон VIP является одним из наименее известных шаблонов в разработке iOS. По сути, это разные реализации шаблона чистой архитектуры дяди Боба.
VIP означает просто View — Interactor — Presenter.
Архитектура VIP для написания чистого кода Swift была представлена Рэймондом Лоу. Он создал чисто-быстрый веб-сайт, на котором можно прочитать о том, как использовать шаблоны VIP в UIKit.
На самом деле VIP был создан для исправления MVC, или Massive View Controllers, распространенной проблемы в приложениях UIKit, где View Controllers становятся основным объектом, в котором хранится код, и они становятся значительно огромными, поскольку в них хранится большая часть, если не вся ваша логика. Это также может вызвать много проблем для вас позже, когда ваша цель состоит в том, чтобы расширить ваше приложение, добавляя все больше и больше функций. Кроме того, VIP является однонаправленным, что избавляет от необходимости смешивать наши компоненты кода друг с другом.
Вид
Представление — это, как правило, пользовательский интерфейс вашего приложения. Его роль заключается в отправке запросов интерактору каждый раз, когда пользователь взаимодействует с пользовательским интерфейсом.
Интерактор
Interactor заботится о бизнес-логике вашего приложения, такой как выборка или отправка данных из сети или сохранение данных в базе данных. Когда представление что-то запрашивает, интерактор выполняет обработку и отправляет результат в качестве ответа презентатору.
Ведущий
Presenter обрабатывает логику презентации. Он форматирует полученные данные в модели представления, подходящие для отображения, а затем передает их в представление.
Начало работы с CleanSpaceX
CleanSpaceX — это пример проекта, который я создал для демонстрации реализации чистой архитектуры. Он в основном состоит только из двух сцен, то есть Rockets и RocketDetails
.
Их имена говорят сами за себя, какую цель они выполняют: Rockets Scene получает список ракет SpaceX вместе с подробностями из их конечных точек с открытым исходным кодом, а RocketDetails
Scene показывает детали конкретной выбранной ракеты.
Здесь вы видите структуру сцены, созданную с каждым компонентом, отличным друг от друга. Итак, теперь давайте рассмотрим каждый из них по отдельности. Перед этим сделайте быстрый предварительный просмотр того, что мы собираемся построить.
Модели
В этом компоненте будут сохранены все модели, относящиеся к нужному контроллеру. Он будет иметь тип struct и в основном будет содержать структуры Request, Response и ViewModel
.
В приведенной выше модели вы можете ясно видеть структуры для Request, Response и ViewModel, и оттуда все становится довольно очевидным.
Request
будет включать параметры, которые необходимо отправить для любого сетевого вызова (в нашем случае для SpaceX). Response
будет включать параметры, которые следует ожидать в ответ на наш сетевой вызов, а ViewModel
— это раздел, в котором вышеуказанные параметры отображаются в соответствии с вариантом использования.
Маршрутизатор
Работа маршрутизатора заключается в выполнении всех задач, связанных с переходом и передачей данных между контроллерами представления.
Выше мы рассмотрели оба случая, когда мы не только переходим к другому контроллеру представления, но и передаем некоторые данные нашему целевому контроллеру представления. Обратите внимание, что определены два протокола с именами RocketData
, Passing
и RocketsRoutingLogic
.
RocketDataPassing
— это протокол, содержащий данные, которые необходимо передать целевому контроллеру.RocketsRoutingLogic
— это тот протокол, в котором сохраняются все методы, используемые для маршрутизации.
Рабочий
Компонент Worker обрабатывает все сетевые запросы и ответы. Структура Response (которую мы использовали в моделях) подготовит данные для Interactor. Он будет обрабатывать ответ об успехе/ошибке, поэтому Interactor будет знать, что делать дальше.
Интерактор
Интерактор является наиболее важным компонентом из всех и работает как модератор между Worker и Presenter. Первоначально он связывается с ViewController
, который передает все параметры запроса, необходимые для работника. Прежде чем перейти к рабочему, выполняется проверка, чтобы проверить, все ли отправлено правильно. Worker возвращает ответ, а Interactor передает этот ответ Presenter.
Здесь обратите внимание, что используется пара протоколов с именами RocketsDataStore
и RocketsBusinessLogic
, и они служат следующей цели:
RocketsDataStore
— используется для передачи данных между контроллерами представленияRocketsBusinessLogic
— используется для объявления всех методов Interactor в этом протоколе, поэтому они могут быть доступны для использования в ViewController.
Ведущий
После получения ответа от Interactor пришло время отформатировать его в ViewModel и передать результат обратно в ViewController
. Ведущий отвечает за логику презентации. Этот компонент решает, как данные будут представлены пользователю.
В Presenter
объявлен только один протокол, в котором хранятся методы логики представления. В функции presentFetchRockets()
вызывается метод делегата, объявленный в связанном с ним контроллере представления. Вот как он соединяется с контроллером представления.
ViewController
Теперь пришло время увидеть, как все это работает, все компоненты выровнены друг с другом, но, тем не менее, нам нужно выполнить один последний важный шаг, чтобы весь этот поток заработал.
Здесь, как вы можете видеть, было объявлено простое табличное представление вместе с его делегатами, которые используются для отображения полученных данных API в представляемой форме.
Последний шаг — запустить интерактор, который в конечном итоге запустит наш цикл, в котором будет отправлен запрос, и мы получим ответ от презентатора. В течение этого времени, если пользователь захочет куда-то перейти, мы приведем в действие Router
.
Заключение
Весь проект можно получить по этой ссылке. Не стесняйтесь поиграть с ним и дайте мне знать любые рекомендации. Обратите внимание, что мы также можем установить чистый шаблон Swift в наш Xcode, что позволит нам создать полную сцену с помощью редактора.
Чтобы узнать, как настроить Xcode, обратитесь к этому пошаговому руководству.