Как правильно отправлять данные/модуль вызова из другого модуля в VIPER (swift)?

#swift #navigation #viper-architecture

Вопрос:

Маршрутизатор содержит ссылку на навигационный контроллер, который содержит сложенные контроллеры просмотра 1,2,3 (из модулей 1,2,3). Теперь модуль 3 командует маршрутизатором navigationController.popToRoot и должен звонить someFunc() из модуля 1.

Если это обычный проект , который я вызываю popToRoot , получите контроллер корневого представления и позвоните someFunc() напрямую. Но как это правильно сделать с архитектурой VIPER?

Ответ №1:

Я бы предложил два способа:

1) Внедрить Координатора. Сообщите Координатору , что есть a navigationController , и сделайте его доступным для каждого Router , предположительно двунаправленного. Затем координатор может вызвать метод Module1, когда Module3 будет выполнен.

2) Внедрите систему уведомлений. Просто продолжайте звонить popToRoot в Module3 Router и отправляйте уведомления в NotificationCenter . Поскольку модуль 1 все еще будет жив (поскольку они сложены), он может действовать/реагировать соответствующим образом.

Я бы проголосовал за первый вариант, хотя наличие координатора в VIPER очень (и субъективно) помогает с маршрутизацией.