【问题标题】:What is the best way to avoid singletons in iOS swift [closed]在iOS swift中避免单例的最佳方法是什么[关闭]
【发布时间】:2020-01-23 05:24:26
【问题描述】:

我有一些应用程序范围的参数,可以从任何地方访问。比如用户名。 (如果我为它创建一个单例,该应用程序将是一个单用户应用程序,但我需要更多。)

iOS 为我们提供了一些单例,例如应用程序委托,我开始将参数放在那里。我创建了一个很好的 UIViewController 扩展,可以透明地访问它:

extension UIViewController {
        var configuration: Configuration {
             get { return (UIApplication.shared.delegate as! AppDelegate).configuration }
        }
}

我还有一个主屏幕,我可以像上面的配置一样移动所有参数,也许将它们包装到一个参数类中,然后UIViewcontroller 扩展将浏览导航堆栈以找到主屏幕,它有这个属性。

单例对于懒惰的程序员来说非常好:它可以从任何地方访问,不需要在对象之间传递任何东西。使用类扩展就像单例,但仍然有一个类负责它。 (好吧,如果它是应用程序的委托,它仍然像一个单例,但使用主视图控制器的属性会破坏这种反模式。)

我认为,由于我使用的是老朋友 MVC,所以上面的解决方案会起作用。但不幸的是,UIApplicationDelegate 只能从主线程访问(导航堆栈也是如此),所以我总是必须从后台线程调度它。

出于这个原因,我已经开始重构上述解决方案,并且始终将属性作为参数从一个类传递到另一个类。现在,我必须放很多代码来实现这一点,包括为 segue 做准备,我只使用故事板连接,没有一行代码。

避免单例的最佳方法是什么?

【问题讨论】:

  • 首先你声明单例是一种反模式,任何支持他们的人都应该停止阅读,然后最后你问你是否应该使用单例?那应该如何工作?
  • 我编辑了这个问题,请您投票支持重新打开它吗?
  • 但是您已经有了一个可以接受的答案? (而且我仍然认为它对 SO 来说太宽泛了)
  • 为什么你认为它太宽泛了?

标签: ios swift model-view-controller singleton appdelegate


【解决方案1】:

我认为你应该看看 Coordinator 模式 - 有很多很好的教程。然后,您可以让一些协调器仅用于基于用户的屏幕,并正确执行当前用户的一些协议默认实现,以避免不得不不断地传递当前用户

【讨论】:

  • 为了保持你的分数,请在问题下方投票支持重新打开。
  • 我真的不知道如何投票支持重新开放哈哈。但我确实认为你的问题是对建筑的很好的讨论。
  • 标签下方有一个重新打开标签,请点击它。
  • 我想我需要 X 的声望才能拥有该功能,因为它不存在。
  • 你是对的,不幸的是 3000。 meta.stackexchange.com/help/reopen-questions(我也没有这个数量,但这是我自己的问题,250 就够了。)
猜你喜欢
  • 2010-09-08
  • 1970-01-01
  • 1970-01-01
  • 2019-08-23
  • 2011-01-12
  • 2016-10-25
  • 2014-12-15
  • 1970-01-01
相关资源
最近更新 更多