为什么在 VIPER 架构中双向使用协议而不是单向使用协议

Why protocols are used in both direction in VIPER architecture rather than in one direction

我们想将我的架构从 MVC 更改为 VIPER。我按照 http://mutualmobile.github.io/blog/2013/12/04/viper-introduction/

阅读基础教程

源代码 link : 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 进行通信的地方 ---> 演示者是通过预设者的对象和演示者 --- > viewcontroller 通过委托(协议)。我认为这是为了避免保留循环。

但我还学习了一个教程https://www.objc.io/issues/13-architecture/viper/ 源代码 link :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) 我观察到两个协议引用都带有强 属性 声明 classes.won 这不会导致保留周期吗?

1) 如果View(UIViewController)被释放,那么整个模块都会被释放。

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

2)在VTDListWireframe中,listViewController是RootViewController所以不会release所以不会导致retain recycle。只需阅读这些代码,了解我的想法。

  1. 他之所以在presenter这个方向使用委托---> viewcontroller是因为Presenter一定什么都不知道关于 ViewController。他们必须解耦。 Presenter 必须是独立的,因此是可重用的。而且那个委托 var 一定很弱 在这个方向上使用协议的一个原因 ViewController ---> Presenter 是您可以通过使 Presenter 符合新协议来轻松扩展 Presenter 的功能
  2. 是的。例如, @属性(非原子,强)UIViewController