如果所有视图都访问应用中的同一个模型,我认为Singleton模式就足够了,对吗?
例如,如果MainView和ChildView访问相同的模型(例如AppSetting),如下所示,我找不到任何理由使用EnvironmentObject而不是Singleton模式。**如果我这样使用会有什么问题吗?**如果可以,那么我应该何时使用EnvironmentObject而不是Singleton模式?
class AppSetting: ObservableObject {
static let shared = AppSetting()
private init() {}
@Published var userName: String = "StackOverflow"
}
struct MainView: View {
@ObservedObject private var appSetting = AppSetting.shared
var body: some View {
Text(appSetting.userName)
}
}
struct ChildView: View {
@ObservedObject private var appSetting = AppSetting.shared
var body: some View {
Text(appSetting.userName)
}
}
先谢了。
3条答案
按热度按时间elcex8rz1#
你是对的,在这种情况下没有理由使用环境对象。苹果甚至鼓励不要过度使用环境对象。
然而,如果你在许多视图中使用一个对象,那么EnvironmentObject也会很棒,因为这样你就不必把它从视图A传递到B,从B传递到C等等。
您经常会发现,即使@State和@Binding也足以在一个视图中以及两个视图之间共享和更新数据。
tjjdgumg2#
我认为当你的应用通过Scene支持多个窗口时(例如基于文档的应用),单例可能不是一个解决方案,而EnvironmentObject更好。例如你想共享selectedColor。当你使用单例时,selectedColor在整个应用中,在每个场景中(在窗口的每个视图中)都是相同的。但如果你想使用单独的设置,EnvironmentObject很方便。
r1zk6ea13#
我发现单例更容易,因为你可以在类中使用它,而不是通过.onAppear()在类中传递它。
单例:
环境目标: