【发布时间】:2015-05-07 16:57:36
【问题描述】:
我正在尝试实现 Robert Martin 描述的Clean Architecture。 更具体地说,我使用的是 VIPER,它是 iOS 版本的 Clean Architecture。
我遇到的问题如下:
用户开始查看带有地点(图钉)的地图。 如果他点击一个按钮,一个图钉就会被放下,然后他会被带到另一个视图以创建(或编辑,如果它是对现有图钉的点击)该位置(或取消)。 在这个其他视图中,用户可以编辑该地点的信息,然后单击“返回”或“完成”(或“编辑”)。 如果他单击“完成”,PlaceDetailsViewController 会向 PlaceDetailsPresenter 发送带有地点信息的消息,并且 PlaceDetailsPresenter 使用 CreatePlaceInteractor 来创建地点。此交互器返回用于识别地点的 GUID。
如果用户在创建地点之前点击返回,他会返回地图,并且放置的图钉会上升并离开(因为它没有 GUID,所以它是一个新地点并且会消失)。 如果他在创建后点击返回,则图钉会停留在那里(因为它应该有一个 GUID)。
我应该如何连接所有这些以及地点信息(包括 GUID)应该存储在哪里? 再澄清一点:
- 谁应该通知 MapPresenter 该图钉是留在那里还是消失? 是 PlaceDetailsPresenter 还是我应该将此信息传递给 PlaceDetailsWireframe -> MapWireframe -> MapPresenter -> MapView ?
- 在返回之前,此 GUID 应存储在 PlaceDetailsPresenter 中还是 PlaceDetailsViewController 中?
现在这就是我所拥有的:
编辑:
基本上我认为问题在于 VIPER 来自 Robert Martin 的 Clean Architecture,他来自 Web (Rails) 背景,因此他对状态的考虑不多(或者在他的演讲中没有具体说明)。
这主要是我的问题,状态应该存储在哪里,不同的模块应该如何通信,应该通过Wireframe,还是通过数据库,或者通过interactor,或者通过Presenter相互通信,就像这里https://github.com/objcio/issue-13-viper-swift.
【问题讨论】:
-
我刚开始使用 VIPER,但让演示者相互了解让我感觉不对。我喜欢通过线框/路由器相互通信的模块。很高兴在这里得到纠正,因为我仍在学习这种架构。
-
我倾向于和你一样思考,虽然我仍然没有找到一个决定性的答案来解决如何在它们之间传递信息,是否通过线框传递数据结构更好(这里有 2 个选项,始终使用相同的大数据结构,或者不断变化以传递最少的必要信息(最终创建更多不可重用的类)),或者将状态保存在交互器中并使用它们来检索信息在另一个演示者中。我发布了另一个 stackoverflow 问题,解释了我所说的大数据结构是什么意思,只是还没找到。
标签: ios architecture software-design