SwiftUI?中的环境对象与单例对象

amrnrhlw  于 2023-02-15  发布在  Swift
关注(0)|答案(3)|浏览(213)

如果所有视图都访问应用中的同一个模型,我认为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)
    }
}

先谢了。

elcex8rz

elcex8rz1#

你是对的,在这种情况下没有理由使用环境对象。苹果甚至鼓励不要过度使用环境对象。
然而,如果你在许多视图中使用一个对象,那么EnvironmentObject也会很棒,因为这样你就不必把它从视图A传递到B,从B传递到C等等。
您经常会发现,即使@State和@Binding也足以在一个视图中以及两个视图之间共享和更新数据。

tjjdgumg

tjjdgumg2#

我认为当你的应用通过Scene支持多个窗口时(例如基于文档的应用),单例可能不是一个解决方案,而EnvironmentObject更好。例如你想共享selectedColor。当你使用单例时,selectedColor在整个应用中,在每个场景中(在窗口的每个视图中)都是相同的。但如果你想使用单独的设置,EnvironmentObject很方便。

r1zk6ea1

r1zk6ea13#

我发现单例更容易,因为你可以在类中使用它,而不是通过.onAppear()在类中传递它。
单例:

class ViewModel {
  private let appSetting = AppSetting.shared
}

环境目标:

class SomeClass {
  private var appSetting : AppSetting?
  
  func addAppSetting(_ appSetting : AppSetting) {
    self.appSetting = appSetting
  }
}

struct MyView: View {
  @EnvironmentObject var appSetting : AppSetting
  @StateObject var someClass = SomeClass()
  var body: some View {
    ZStack {
    }
    .onAppear {
      someClass.addAppSetting(appSetting)
    }
  }  
}

相关问题