我在SwiftUI中被认为是纽比,我有下面的ViewModel。但我不确定MyViewModel是否应该是单例的。这个用法对吗?符合ObservableObject的最佳实践/用法是什么?
class MyViewModel: ObservableObject {
static let shared: MyViewModel = MyViewModel()
@Published var result: String = ""
private init() { }
// some functions
}
struct ContentView: View {
@ObservedObject private var vm = MyViewModel.shared
var body: some View {
Text(vm.result)
}
}
2条答案
按热度按时间lymnna711#
为什么你认为视图模型应该是单例的?特别是,为什么一个符合
ObservableObject
的类需要一个单例示例?这是个坏主意这不仅是绝对不必要的,而且还意味着您不能在屏幕上拥有同一视图的多个示例,而它们没有共享状态。这在iPad上尤其糟糕,如果你想支持分屏,并在屏幕上同时运行你的应用程序的2个场景。
不要让任何东西都成为单例,除非你绝对不得已。
在SwiftUI
View
s上存储@ObservedObject
s时,唯一需要记住的重要事情是,它们永远不应该在视图中初始化。当@ObservedObject
更改(或其@Published
属性更改)时,存储它的View
将被重新加载。这意味着如果在View
中创建对象,每当对象更新时,视图本身将创建该对象的新示例。所以这是个坏主意,不会起作用:
相反,您需要将视图模型注入到您的
View
中(通过在父视图或协调器等中创建它,无论您从哪里创建ContentView
)。yfjy0ee72#
我就是用这种方式实现我的场景的。我们能说这是正确的方式吗?