AppDelegate属性还是Singleton对象?

时间:2015-04-18 09:08:26

标签: ios singleton core-location appdelegate locationmanager

这更像是一个设计最佳实践问题:

当你设计结构时,让我们说一个基于位置的应用程序。位置管理器显然是一个重要的实例,应该可以轻松访问其他对象。

你应该将它作为appDelegate的属性吗?或者单身一个单身?

在什么情况下你更喜欢一个?

我知道两者都有效,但我想确保我能以正确的方式做事,而不仅仅是将所有事情混为一谈。

非常感谢您的投入!

5 个答案:

答案 0 :(得分:2)

都不是。

通过自定义初始化方法或属性传递位置管理器对象。

这符合SOLID principals SO& D(单一责任,开放式,依赖性倒置)。

也可以更轻松地进行嘲笑测试。

答案 1 :(得分:2)

最糟糕的选择IMO是将内容存储在app delegate中。有关详细信息,请参阅What describes the Application Delegate best? How does it fit into the whole concept?。简而言之,app delegate是Application Delegate。它不是全球事物的应用倾销场所。"

单身人士是ObjC中一种历史悠久的方法,通过shared...模式。经过几十年的流行,并在核心Cocoa框架中广泛使用(NSUserDefaultsNSNotificationCenterNSApplicationNSFontManagerNSWorkspaceUIDevice,近年来,他们对其他技术有所忽视,尤其是依赖注入,"依赖注入等等。这只是说"分配给一个财产。"

在ObjC中使用单身人士多年后,我开始研究DI的思维方式。可测试性的改进和依赖性的改进清晰度非常好。也就是说,有时DI会导致尴尬的过渡,特别是在处理故事板时。

所以,我会说:

  • 在可行的情况下,只需构造对象并将它们分配给需要它们的对象上的属性。
  • 如果您有很多要传递的内容,请考虑将它们收集到单个"配置中。对象并传递它(但这有点伤害模块性)。
  • 如果DI造成混乱(特别是如果它导致很多传递对象的东西只是因为它们可以将对象传递给其他东西),或者如果它强制你可以避免的很多故事板segue代码,单身在Cocoa中是一个成熟且备受尊重的模式并没有错。它们是Cocoa Core Competency
  • 如果您发现自己正在呼叫(MyAppDelegate *)[[UIApplication sharedApplication] delegate],那么您就是在做错事。

答案 2 :(得分:1)

为位置管理制作另一个单身人士。 Single responsibilitySOLID的第一原则。

答案 3 :(得分:0)

想想你在AppDelegate中真的需要它吗?

对于位置管理器,例如,不,不。你最好将位置管理器及其所有相关方法保存在一个单独的类中,以保持奇异性原则,如@vladimir所说,并且能够在以后重用它。

AppDelegate负责处理应用启动和/或进入后台时发生的情况,初始化核心数据,注册推送通知以及其他第三方库,如解析,......

向appDelegate添加其他内容会使其随着时间的推移而变大,维护起来会非常困难。

何时添加不属于AppDelegate的内容?我认为当应用程序很小时,你知道它不会扩展,并且你需要在清洁代码上花时间。

通过Matt检查AppDelegate responsibilitiesanswer

答案 4 :(得分:0)

您可以创建CLLocationManager的多个实例,并在需要时使用它们。

如果您创建一个实例并尝试共享它,那么您将难以转发周围的委托方法,或者尝试将它们重新实现为通知而导致混乱。