Вопрос проверяет понимание ключевого взаимодействия слоёв и управления памятью в VIPER
View и Presenter в VIPER связаны через протоколы. View хранит сильную ссылку на Presenter, а Presenter — слабую ссылку на View. View передаёт пользовательские события Presenter. Presenter обрабатывает их и обновляет View через интерфейс. Такая схема предотвращает retain cycle и делает код тестируемым.
Связь View и Presenter — один из самых важных аспектов VIPER.
Перед тем как рассматривать детали, важно понять роли:
View — отображение и события
Presenter — координация логики и UI
View реализует интерфейс:
protocol UserViewInput: AnyObject {
func show(name: String)
}
Presenter хранит ссылку:
class UserPresenter {
weak var view: UserViewInput?
}
Типичный сценарий выглядит так:
Пользователь совершает действие
View сообщает Presenter
Presenter вызывает Interactor
Presenter получает результат
Presenter обновляет View
Presenter хранит weak ссылку на View, потому что:
View владеет Presenter
View — UI-объект с собственным жизненным циклом
strong-ссылка привела бы к retain cycle
View хранит strong ссылку на Presenter, потому что:
Presenter является частью экрана
Presenter должен жить столько же, сколько View
Благодаря такой связи:
Presenter можно тестировать без View
View можно подменять моками
логика изолирована от UIKit
Связь View и Presenter в VIPER строится на протоколах и слабых ссылках. Это обеспечивает контроль жизненного цикла, отсутствие retain cycle и хорошую тестируемость.