Ios StateObject属性没有';无法更新视图,但ObservedObject无法更新

Ios StateObject属性没有';无法更新视图,但ObservedObject无法更新,ios,swiftui,realm,Ios,Swiftui,Realm,我正在另一个视图中将数据保存到领域数据库中,在该视图中我使用@EnvironmentObject var modelData:DBViewModel 并在此视图中加载它们 struct SelectedSinsList: View { @StateObject var modelData = DBViewModel() //@ObservedObject works, as it always recreates the List when I open this view and values

我正在另一个视图中将数据保存到领域数据库中,在该视图中我使用
@EnvironmentObject var modelData:DBViewModel
并在此视图中加载它们

struct SelectedSinsList: View {
@StateObject var modelData = DBViewModel() //@ObservedObject works, as it always recreates the List when I open this view and values are updated
var body: some View {
    NavigationView {
        ScrollView{
            VStack(spacing: 15){
                ForEach(modelData.sins){sin in //..........

该行为表明,视图使用新数据更新的唯一原因是父视图正在重新绘制,从而触发要重建的“无主”观察对象

State和StateObject在视图结构体失效和重新绘制后持续时间更长。要使用它们,您需要通过调用self.objectWillChange.send()将StateObject中的回调或发布服务器连接到其objectWillChange发布服务器


但是,如果DBViewModel已经是一个environmentObject,为什么要重新创建它呢?

该行为表明,视图使用新数据更新的唯一原因是父视图正在重新绘制,从而触发要重建的“无主”观察对象

State和StateObject在视图结构体失效和重新绘制后持续时间更长。要使用它们,您需要通过调用self.objectWillChange.send()将StateObject中的回调或发布服务器连接到其objectWillChange发布服务器


但是,如果DBViewModel已经是一个environmentObject,为什么要重新创建它呢?

谢谢,我发现我对environmentObject的理解有点错误,…现在我在俯视图中创建了DBViewModel的一个实例,同时还将.environmentObject(modelData)设置为所有子视图,以便它们具有祖先,然后在其他任何地方使用@EnvironmentObject modelData(在这些视图中)。是的。State/StateObject=在该视图的生命周期中拥有(这是您在顶级视图或应用程序结构中使用的)。您可能还发现environmentObject是传递颜色和维度信息的一种很好的方法,而不是使用全局常量。即使是ButtonStyle或ViewModifier也将接收环境。但有一件事。。。对应用程序的很大一部分使用相同的视图模型是不可取的,因为它变得脆弱且无所不知。您可能仍希望创建单个视图模型,但可以使用environmentObject工厂实例化这些视图模型并将其数据传递给它们。如果使用工厂方法,您可以查看我的回答历史,了解如何让视图模型触发其objectWillChange publisher。谢谢,我发现我对EnvironmentObject的理解有点错误,…现在我在俯视图中创建了DBViewModel的一个实例,同时还将.EnvironmentObject(modelData)设置为所有子视图,以便它们都有祖先,然后在其他任何地方(在这些视图中)使用@EnvironmentObject modelData。是的。State/StateObject=在该视图的生命周期中拥有(这是您在顶级视图或应用程序结构中使用的)。您可能还发现environmentObject是传递颜色和维度信息的一种很好的方法,而不是使用全局常量。即使是ButtonStyle或ViewModifier也将接收环境。但有一件事。。。对应用程序的很大一部分使用相同的视图模型是不可取的,因为它变得脆弱且无所不知。您可能仍希望创建单个视图模型,但可以使用environmentObject工厂实例化这些视图模型并将其数据传递给它们。如果使用工厂方法,您可以查看我的回答历史,了解如何让视图模型触发其objectWillChange publisher。