有没有办法将一个 ObservableObject 中的 Published var 嵌入到另一个 ObservableObject 中?
Is there a way to embed a Published var in one ObservableObject into another ObservableObject?
我有一个 Auth store(一个 ObservableObject),它存储用户是否已经通过应用程序的身份验证。我在用户登录时管理身份验证存储,实质上是将身份验证状态从 notAuthenticated 更改为已验证。我在另一个 ObservableObject 的 ViewModel 中使用相同的状态变量,它引用 Auth store 单例对象。我认为可能有比下沉变量并在 ViewModel 上更新它更简单的方法(比如直接在 ViewModel 中嵌入 Auth 变量)。
这是授权商店模型的简化代码
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
}
}
这是依赖注入的好时机,正如@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)
为了测试,您可以注入一个测试值。
我有一个 Auth store(一个 ObservableObject),它存储用户是否已经通过应用程序的身份验证。我在用户登录时管理身份验证存储,实质上是将身份验证状态从 notAuthenticated 更改为已验证。我在另一个 ObservableObject 的 ViewModel 中使用相同的状态变量,它引用 Auth store 单例对象。我认为可能有比下沉变量并在 ViewModel 上更新它更简单的方法(比如直接在 ViewModel 中嵌入 Auth 变量)。
这是授权商店模型的简化代码
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
}
}
这是依赖注入的好时机,正如@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)
为了测试,您可以注入一个测试值。