我有一个Auth存储(一个ObservableObject),该存储存储用户是否已向应用程序验证身份。我在用户登录时管理身份验证存储,实际上是将身份验证状态从notAuthenticated更改为authenticated。我在另一个ObservableObject的ViewModel中使用相同的状态变量,该变量引用Auth存储单例对象。我认为,执行此操作可能比将变量下沉并在ViewModel上更新(例如将Auth变量直接嵌入ViewModel中)更简单。
这是身份验证商店模型的简化代码
class Auth: ObservableObject {
static let shared = Auth()
@Published var currentState: AuthState = .notAuthenticated
enum AuthState {
case notAuthenticated
case authenticated
}
}
这是简化的视图模型
class SampleViewModel: ObservableObject {
@Published var authState = Auth.shared.currentState
init() {
Auth.shared.$currentState.sink { newAuthState in
self.authState = newAuthState
} // Is there any simple way in which I can skip sinking the publishr
}
}
答案 0 :(得分:2)
这是进行依赖项注入的好时机,正如注释中提到的@Asperi一样,拥有两个反映相同状态的有状态对象也不是一个好主意...
像这样更好的恕我直言:
class SampleViewModel: ObservableObject {
let authState: AnyPublisher<Auth.AuthState, Never>
init<P>(authState: P) where P: Publisher, P.Output == Auth.AuthState, P.Failure == Never {
self.authState = authState.eraseToAnyPublisher()
}
}
然后使用如下代码创建它:
let viewModel = SampleViewModel(authState: Auth.shared.$currentState)
要进行测试,您可以输入测试值。