3

我们想将我的架构从 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;
}

来自视图控制器的通信 ---> 演示者是通过预设器的对象和演示者 --- > 视图控制器通过委托(协议)。我认为这是为了避免保留周期。

但我还浏览了另一个教程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)我观察到两个协议引用在两个类中都具有强属性声明。它不会导致保留周期吗?

4

2 回答 2

4
  1. 他之所以在这个方向使用委托presenter--->viewcontroller,是因为Presenter一定对ViewController一无所知。它们必须解耦。Presenter 必须是独立的,因此是可重用的。并且那个委托变量必须是弱的在这个方向上使用协议的一个原因ViewController ---> Presenter是您可以通过使您的 Presenter 符合新协议来轻松扩展 Presenter 的功能
  2. 是的。例如,@property (nonatomic, strong) UIViewController
于 2017-11-28T11:19:26.950 回答
2

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

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

在此处输入图像描述

2)在VTDListWireframe中,那个listViewController是RootViewController所以它不会被释放所以它不会导致retain recycle。只需阅读idea imo的这些代码。

于 2016-02-25T03:09:51.430 回答