2017-07-30 119 views
0

当使用“模型”控制器并使用依赖注入在VC之间传递它们时,如何处理某些控制器需要从另一个控制器获知信息的事实?依赖注入和模型控制器相互了解

这里的一个具体的例子,有具有3级模型的控制器虚构的应用:

  • ContentStore:载荷并保持该应用程序的内容,特定用户登录
  • 的UserManager。 :包含一个用户对象,并记录用户输入/输出,更新登录用户的信息等。
  • NetworkController:了解Web服务的唯一控制器。

ContentStore的UserManager将举行网络控制器的引用,来调用Web服务而不需要知道它们的实现(尊重的关注和单一职责原则的分离)。在AppDelegate中创建NetworkController,然后将它的参考ContentStore和的UserManager:

的AppDelegate - didFinishLaunchingWithOptions

let networkController = NetworkController() 
let contentStore = ContentStore(networkController: networkController) 
let userManager = UserManager(networkController: networkController) 

// Inject contentStore and userManager into the first VC 

但是,让我们说ContentStore要加载特定用户定制的应用内容登录。它需要知道它的用户ID。并且网络控制器也需要知道用户ID以传入网络呼叫。

什么是一个干净的方式来实现这一点,控制器之间共享信息?从我能想出的不同方式来看,唯一看起来不算太糟糕的是:

所有ContentStore和NetworkController方法都有一个userId参数,并且它们本身从不会调用这些方法,它们总是被调用一个VC。该VC可以传递用户ID,因为它知道UserManager和ContentStore。

有没有比这个建议最干净的方法?

回答

-1

这似乎不是一个好的建筑。这当然取决于你的架构,但在视图控制器之间共享数据并不是你说的最安全的想法。

我建议你寻找到一些架构上的设计模式适用于iOS:主要MVCMVPMVVMVIPER。我亲自使用MVVM并增加了一个路由器。你可以参考this来解释和比较这些模式。

路由器处理从一个视图控制器到另一个视图控制器的路由,通过初始化它的视图模型和路由器。所以,如果我需要从VC 一个到VC 传递数据,我只是从一个的视图模型养活数据VC 的视图模型。没有视图控制器之间的任何直接连接,我只是将数据从场景A传递到场景B.

希望这会有所帮助。

+0

谢谢,我会读这个!我研究了主要的iOS架构模式,并决定坚持使用MVC模式,包括模型,视图,视图控制器和模型控制器。受Matteo Manferdini影响很大(例如http://matteomanferdini.com/how-ios-view-controllers-communicate-with-each-other/)。所以我现在坚持使用MVC,我只是想把它做好。仅供参考请遵守答案的第二部分,我使用一种协议来传递VC之间的依赖关系,如果目的地符合协议,那么VC就不会彼此了解。 – Kqtr