为什么在 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)被释放,那么整个模块都会被释放。
2)在VTDListWireframe中,listViewController是RootViewController所以不会release所以不会导致retain recycle。只需阅读这些代码,了解我的想法。
- 他之所以在presenter这个方向使用委托---> viewcontroller是因为Presenter一定什么都不知道关于 ViewController。他们必须解耦。 Presenter 必须是独立的,因此是可重用的。而且那个委托 var 一定很弱
在这个方向上使用协议的一个原因 ViewController ---> Presenter 是您可以通过使 Presenter 符合新协议来轻松扩展 Presenter 的功能
- 是的。例如,
@属性(非原子,强)UIViewController
我们想将我的架构从 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)被释放,那么整个模块都会被释放。
2)在VTDListWireframe中,listViewController是RootViewController所以不会release所以不会导致retain recycle。只需阅读这些代码,了解我的想法。
- 他之所以在presenter这个方向使用委托---> viewcontroller是因为Presenter一定什么都不知道关于 ViewController。他们必须解耦。 Presenter 必须是独立的,因此是可重用的。而且那个委托 var 一定很弱 在这个方向上使用协议的一个原因 ViewController ---> Presenter 是您可以通过使 Presenter 符合新协议来轻松扩展 Presenter 的功能
- 是的。例如, @属性(非原子,强)UIViewController