问题一:使用两种方法执行相同操作来构建一个(或多个)用例的正确方法是什么?
在 VIPER 设计中,您可以在同一个 Interactor 中创建两种适合每个主要用例和备用用例的方法。
问题2:(基于巴维克的回答)
因此,我并不需要一名演示者对应一名交互者,我可以有 1 个交互者和 3 个演示者/视图。
根据我们的讨论和您的更新,我想我更好地理解了。
- Presenter/View 的交互不应超过 Interactor。
- 演示者/视图可能根本不与任何交互器交互,如
CameraView
.
- 它们是《威世智》中的中间视图。
- 多个 Presenter/View 可以与单个 Interactor 进行交互。
- Interactor 不绑定任何 Presenter。
- 单个交互器负责单个用例及其所有备用流程。 1-1关系。
所以,你应该有单身EditPlacePresenter/View
for EditPlaceInteractor
传递数据 放置带或不带照片的数据。
问题3:我的交互器边界方法是否应该始终返回 void?
在 bhavik 的示例中,他们返回一些东西,但在 VIPER 博客和 Bob 叔叔的视频中,他们总是返回 void,结果以交互者在演示者/控制器上调用的另一个边界方法的形式出现。
我认为您指的是下面的 Presenter 方法,该方法从 Interactor 接收结果。
- (void)foundUpcomingItems:(NSArray*)upcomingItems
为了使上述工作正常进行,交互器将具有委托实例,演示者/控制器将通过这些委托实例来查找结果或数据。这意味着 Presenter/Controller 与 Interactor 绑定在一起,或者它们的引用或返回函数指针在每个 Interactor 方法调用中传递。这是设计使然吗?
我认为,Interactor 应该根据用例返回数据。例如,Interactor 应该返回成功或失败的 EditPlaceResult。
- 如果成功,它应该包括保存的数据,例如地点 ID。
- 如果失败,应包括失败原因。
这应该是用例的一部分。如果不是的话,它不应该返回任何东西。它将返回 void,并且 Presenter 将查询单独的 Interactor 以检查 Map Place 是否添加成功。
博客中的参考资料:
- Presenter 包含用于准备显示内容的视图逻辑收到时来自交互器。
- 由 Presenter 来获取数据由交互器返回并将其格式化以供演示。
- 主持人收到结果来自交互器并将结果转换为可以有效地在视图中显示的形式。
问题4:VIPER方式不使用控制器,仅使用演示者与交互者对话,而鲍勃叔叔的视频使用控制器和演示者与交互者进行不同的交互。我应该采取哪种方法?
您需要定义 VIPER 路线以进行以下导航:
- 相机按钮:导航自
MapView
to CameraView
(使用地点)
- 长按:导航自
MapView
to EditPlaceView
(使用坐标)
- 拍摄照片:导航自
CameraView
to EditPlaceView
- 保存地点:根据具体情况向交互者发送带/不带照片的保存地点请求,然后跳回
MapView
如果成功的话
- 后退按钮:基于导航堆栈返回到上一个视图
根据 VIPER 博客,视图控制器和导航控制器由演示者和线框使用。
VIPER Wireframe 处理导航并使视图控制器成为精益、平均的视图控制机器。
基本上,线框抽象了导航控制器,而是提供了路线定义。
线框
- 拥有 UINavigationController 和 UIViewController
- 负责创建View/ViewController并将其安装在窗口中
- 路由在线框图中定义,并包含用于描述哪些屏幕以何种顺序显示的导航逻辑
主持人
- 使用线框执行导航
- 为了保持视图控制器的精简,VIPER 需要为视图控制器提供一种在用户执行某些操作时通知相关方的方法 - 演示者来这里!
- 视图控制器不应该根据这些操作做出决定,但它应该将这些事件传递给可以的东西 - 演示者应该做出决定!
问题5:如果我的用例类似于“转到其他屏幕”,它是否应该有一个交互器?由于当前视图将告诉其演示者按下了哪个按钮(要转到哪个视图),并且当前演示者将告诉其线框“更改为另一个线框”。
不需要。作为用例一部分的导航可能不需要交互器。这只是过渡。目标Presenter可能需要一个Interactor。例如,CameraView/Presenter
不需要Interactor,但是EditPlaceView
需要保存这个地方。
全面的:
架构模式背后的思想是将给定的软件应用程序划分为互连的部分,以便将信息的内部表示与向用户呈现或从用户接受信息的方式分开。 MVC、MVP、MVVM、VIPER 都专注于以某种方式隔离视图、逻辑和导航。
架构模式在其想要分解的内容方面受到限制。我们必须明白,架构模式不会分解或隔离一切。此外,如果一种架构模式将某些职责委托给某个部分,则其他模式可能根本不会这样做,或者将多个职责分配给单个部分。
我们可以扩展或限制隔离和分解,只要它能证明原因是合理的,并且不会强加超出成本的不必要的关注点分离。您可以选择使用导航控制器,并且您的演示者可以依赖它们,而无需定义线框路由。这些控制器将负责屏幕之间的导航。