【发布时间】: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