Я читал о чистой архитектуре от Роберта Мартина и более конкретно о VIPER.
Затем я столкнулся с этой статьей/сообщением Опыт бригад с использованием альтернативы MVC, который описывает в значительной степени то, что я сейчас делаю.
После того, как я попытался реализовать VIPER в новом проекте iOS, я столкнулся с некоторыми вопросами:
- Достаточно ли, чтобы ведущий запрашивал информацию в представлении или должен ли "передача информации" всегда начинаться с представления? Например, если представление вызывало какое-либо действие в презентаторе, но затем, в зависимости от параметров, переданных этим действием, ведущему может потребоваться дополнительная информация. Я имею в виду: пользователь постучал "doneWithState:", если состояние == "что-то", получить информацию из представления, чтобы создать сущность, если состояние == "что-то еще", оживить что-то в представлении. Как я должен обрабатывать такой сценарий?
- Допустим, что "модуль" (группа компонентов VIPER) решает представить другой модуль модально. Кто должен отвечать за принятие решения о том, будет ли представлен второй модуль модально, первый каркас модуля или каркас второго модуля?
- Кроме того, скажем, что второй вид модуля вставляется в контроллер навигации, как следует обрабатывать действие "назад"? Должен ли я вручную установить кнопку "назад" с действием во втором контроллере представления модуля, который вызывает ведущего, который вызывает второй каркас модуля, который отклоняет и сообщает первому каркасу модуля, что он был уволен, так что первый контроллер представления модуля может хотите что-то отобразить?
- Если разные модули говорят только через каркас или через делегатов между ведущими? Например, если приложение перешло к другому модулю, но после этого пользователь нажал "отменить" или "сохранить", и этот выбор должен вернуться и что-то изменить в первом модуле (возможно, отобразить анимацию, в которой она была сохранена или удалить что-то).
- Предположим, что на карте был выбран вывод, чем отображается PinEditViewController. При возврате выбранный цвет контактов может потребоваться изменить в зависимости от действий использования на PinEditViewController. Кто должен сохранять состояние текущего выбранного булавки, MapViewController, MapPresenter или MapWireframe, чтобы я мог знать, когда вернемся, какой контакт должен изменить цвет?