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