我正在为iOS创建一个登录应用程序,并且偶然发现了一个设计问题。在我的应用程序中,一些数据(例如current user id
)必须在视图控制器之间共享,所以我最初的想法是将数据保存在AppDelegate
中,并在需要的时候调用它。这是可行的,但这意味着AppDelegate
将做它不打算做的工作,因此它将是糟糕的体系结构,所以我想创建一个单例类来保存所有共享数据。这似乎更有针对性,我在以前的一些应用程序中使用了这种策略,但在搜索单例类的最佳实践时,我发现了许多反对使用它们的结果,因为它们:
(摘自这个问题的最上面的答案:What is so bad about singletons?)
另外两种设计模式的替代方法是在视图控制器之间传回数据,但这似乎也不合适。例如,current user id
I必须将它从登录视图控制器传递到主视图控制器(对于所有用户都是相同的),然后从主视图控制器传递到更指定的视图控制器,该视图控制器是为用户定制的。在这种情况下,主视图控制器持有数据只是为了将其传递给更具体的视图控制器,对我来说,这似乎也违反了单一责任原则。让主视图控制器保存它不需要的数据是不好的设计,还是有更好的选择?
发布于 2015-01-24 11:21:26
没有“神奇”的方法来存储模型-视图-控制器应用程序的模型状态:您构建了一个类,并将它“锚定”在某个地方以便于访问。
一个常见的做法是使用应用程序委托。这是很方便的,因为它是一个系统提供的单一应用程序,但它在逻辑上是次等的,因为,正如您所注意到的,app委托并不是用于此目的的。
另一个常见的策略是使用单例。这在应用程序开发中是司空见惯的,在实践中也很好。您可以通过将对单例的访问限制为视图控制器的初始化器来减轻常见的不满--这解决了隐藏的依赖关系和可测试性问题。
最后,您可以传递数据,在这种情况下,它与在一个视图控制器中“锚定”数据相同。可以说,这会导致比单例更大的问题,因为依赖关系更难跟踪。
我建议将状态存储在单例中,并在视图控制器的初始化代码中使用它。这样,对单例的依赖将保持本地化,并且您可以以最小的努力测试您的逻辑。
https://stackoverflow.com/questions/28124670
复制相似问题