我有 MainView,其中我创建了具有 3 个不同视图的 TabView: 视图A、视图B、视图C。 我还有 ViewModel 的三个定义:
@StateObject private var viewModelA: ViewModelA = ViewModelA()
@StateObject private var viewModelB: ViewModelB = ViewModelB()
@StateObject private var viewModelC: ViewModelC = ViewModelC()
每个视图模型都通过
.environmentObject
修饰符传递到相应的视图,例如 ViewA().environmentObject(viewModelA)
,因此可以在 ViewA 的子视图中使用。
我主要担心的是
ViewC
和 ViewModelC
具有更改应用程序中 database 数据的功能。 ViewA
中使用相同的数据库数据,因此 ViewModelA
中也使用相同的数据库数据。我希望当 A
中的某些操作完成时刷新 C
中的数据。所有ViewModels都可以通过Interactors或Synchronizers访问数据库数据
我知道我可以通过将
viewModelA
作为 viewC
传递给 environmentObject
来实现此目的,然后在 viewModelA's
的其他操作完成时执行一些 C
函数,但是我不知道这是否正确实践。
我还想过创建一些可以在每个 View 或 ViewModel 中注入的单例,并且它会有一些属性 needsToBeRefresh: Bool
告诉我更新不同的 View 或 ViewModel
对于我的情况,最好的解决方案是什么?
在 SwiftUI 中,
View
结构已经是视图模型,您不应该尝试在类中重新实现它,否则您将遇到重大问题。 @StateObject
实际上是为当您需要 @State
中的引用类型而设计的,例如用于执行异步操作,例如加载/保存数据或使用组合管道。从现在起,我们使用 .task
修饰符进行异步/等待,我们实际上甚至不再需要 @StateObject
了。