Почему протоколы используются в обоих направлениях в архитектуре VIPER, а не в одном направлении

Мы хотим изменить мою архитектуру с MVC на VIPER. Я прочитал базовый учебник, следуя http://mutualmobile.github.io/blog/2013/12/04/viper-introduction/

ссылка на исходный код: https://github.com/mutualmobile/Counter

- (void)createScreen
{
    CNTCountViewController* view = [[CNTCountViewController alloc] init];
    CNTCountPresenter* presenter = [[CNTCountPresenter alloc] init];
    CNTCountInteractor* interactor = [[CNTCountInteractor alloc] init];

    view.presenter = presenter;//object
    presenter.view = view;//protocol

    presenter.interactor = interactor;
    interactor.output = presenter;

    self.window.rootViewController = view;
}

Где для связи от viewcontroller ---> Presenter через объект Preseter и Presenter --- > ViewController через делегат (протокол). Я думаю, что это, чтобы избежать сохранения циклов.

Но я также прошел еще один учебник https://www.objc.io/issues/13-architecture/viper/ ссылка на исходный код: https://github.com/objcio/issue-13-viper

где он использовал протоколы только для обоих направлений в VTDListWireframe

- (void)presentListInterfaceFromWindow:(UIWindow *)window
{
    VTDListViewController *listViewController = [self listViewControllerFromStoryboard];
    listViewController.eventHandler = self.listPresenter;//protocol
    self.listPresenter.userInterface = listViewController;//protocol
    self.listViewController = listViewController;

    [self.rootWireframe showRootViewController:listViewController
                                      inWindow:window];
}

Вот

1) В чем преимущество использования протоколов в обоих направлениях?

2) Я заметил, что обе ссылки протокола имеют строгое объявление свойства в обоих классах. Не приведет ли это к сохранению цикла?

2 ответа

Решение

1) Если выпущен View(UIViewController), то будет освобожден весь модуль.

https://medium.com/mobile-travel-technologies/architecting-mobile-apps-with-b-viper-modules-e94e277c8d68

2) в VTDListWireframe этот listViewController является RootViewController, поэтому он не будет выпущен, поэтому он не приведет к повторному использованию. Просто прочитайте эти коды для идеи IMO.

  1. Причина, по которой он использует делегирование в этом направлении Presenter ---> viewcontroller, заключается в том, что Presenter не должен ничего знать о ViewController. Они должны быть отделены. Ведущий должен быть независимым и, следовательно, многоразовым. И этот делегат var должен быть слабым. Одна из причин, по которой протоколы используются в этом направлении ViewController ---> Presenter, заключается в том, что вы можете легко расширить функциональность Presenter, просто подключив Presenter к новому протоколу.
  2. Да. Например, @property (неатомный, сильный) UIViewController
Другие вопросы по тегам