Создать панель запуска

В этом пошаговом руководстве мы узнаем, как использовать шаблон чистой архитектуры 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.

  1. RocketDataPassing — это протокол, содержащий данные, которые необходимо передать целевому контроллеру.
  2. RocketsRoutingLogic — это тот протокол, в котором сохраняются все методы, используемые для маршрутизации.

Рабочий

Компонент Worker обрабатывает все сетевые запросы и ответы. Структура Response (которую мы использовали в моделях) подготовит данные для Interactor. Он будет обрабатывать ответ об успехе/ошибке, поэтому Interactor будет знать, что делать дальше.

Интерактор

Интерактор является наиболее важным компонентом из всех и работает как модератор между Worker и Presenter. Первоначально он связывается с ViewController, который передает все параметры запроса, необходимые для работника. Прежде чем перейти к рабочему, выполняется проверка, чтобы проверить, все ли отправлено правильно. Worker возвращает ответ, а Interactor передает этот ответ Presenter.

Здесь обратите внимание, что используется пара протоколов с именами RocketsDataStore и RocketsBusinessLogic, и они служат следующей цели:

  1. RocketsDataStore — используется для передачи данных между контроллерами представления
  2. RocketsBusinessLogic — используется для объявления всех методов Interactor в этом протоколе, поэтому они могут быть доступны для использования в ViewController.

Ведущий

После получения ответа от Interactor пришло время отформатировать его в ViewModel и передать результат обратно в ViewController. Ведущий отвечает за логику презентации. Этот компонент решает, как данные будут представлены пользователю.

В Presenter объявлен только один протокол, в котором хранятся методы логики представления. В функции presentFetchRockets() вызывается метод делегата, объявленный в связанном с ним контроллере представления. Вот как он соединяется с контроллером представления.

ViewController

Теперь пришло время увидеть, как все это работает, все компоненты выровнены друг с другом, но, тем не менее, нам нужно выполнить один последний важный шаг, чтобы весь этот поток заработал.

Здесь, как вы можете видеть, было объявлено простое табличное представление вместе с его делегатами, которые используются для отображения полученных данных API в представляемой форме.

Последний шаг — запустить интерактор, который в конечном итоге запустит наш цикл, в котором будет отправлен запрос, и мы получим ответ от презентатора. В течение этого времени, если пользователь захочет куда-то перейти, мы приведем в действие Router.

Заключение

Весь проект можно получить по этой ссылке. Не стесняйтесь поиграть с ним и дайте мне знать любые рекомендации. Обратите внимание, что мы также можем установить чистый шаблон Swift в наш Xcode, что позволит нам создать полную сцену с помощью редактора.

Чтобы узнать, как настроить Xcode, обратитесь к этому пошаговому руководству.