【问题标题】:VIPER architecture: how to obtain return info from a moduleVIPER 架构:如何从模块中获取返回信息
【发布时间】:2015-03-26 11:23:51
【问题描述】:

我在处理从另一个模块提供的模块返回的某些信息时遇到问题。就我而言,我有两个模块,地图和搜索。 MapView 通知它要搜索地址,因此MapPresenter 开始显示搜索模块的操作(其视图以模态方式显示)。在搜索模块中,我进行文本搜索,获取结果,显示并选择一个。该选择必须返回到地图模块。如何在不打破界限的情况下实现这一目标?

考虑到,如果我错了,请纠正我,模块之间的通信只能通过路由来实现(而不是通过通知、完成块等在模块之间“跳转”),我实现了这个场景:

(对不起,也许序列图会更好)

MapWireframe 实现了常规接口,但也实现了另一个我称为MapModuleInput 的接口,所以当我开始搜索操作(蓝色)时,我将SearchWireframe 传递给实现该接口的MapWireframe

之后,在红色流程中,在SearchView我开始搜索的情况下,它从交互器等处获取结果。然后呈现结果并且用户选择一个(绿色),所以选择结果通过MapModuleInput接口返回给地图。

那么,对吗?

谢谢!

【问题讨论】:

  • 您的问题得到答案了吗?我有一个类似的stackoverflow.com/questions/28892833/…
  • 我认为问题在于 VIPER 来自 Robert Martin 的 Clean Architecture,并且他来自 Web(Rails)背景,因此他对状态的考虑不多。这主要是我的问题,状态(搜索结果选择,以防你不立即关闭,但仍然想更新后面的MapView)应该存储在哪里,不同的模块应该如何通信,应该通过Wireframe ,或通过@PaNaVTEC 建议的数据库,或通过演示者相互通信,如github.com/objcio/issue-13-viper-swift

标签: ios architecture


【解决方案1】:

如果我理解正确,您有一个带有搜索的“模块”,它会使用搜索交互器进行搜索,检索一些 POI 并将此结果返回给搜索演示者。您有一个可以避免的问题,而不是在 SearchPresenter 中检索结果,只需与地图通信并发送查询,然后在 MapView 中使用 SearchInteractor,现在您不必在模块之间发送对象。 如果您需要按照您在图中绘制的方式执行此操作,请使用 Core Data 之类的 DataSource 来持久化大型对象并稍后在另一个“模块”中检索它。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-12-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-24
    • 2015-05-17
    • 2018-08-20
    相关资源
    最近更新 更多