有没有一种方法可以将一个ObservableObject中的Published var嵌入另一个ObservableObject中?

时间:2020-07-19 11:06:16

标签: swift observer-pattern combine

我有一个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
    }
}

1 个答案:

答案 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)

要进行测试,您可以输入测试值。