我对 SwiftUI 和合并非常陌生,尽管我有丰富的 Swift 经验,并且有一些 ReactiveKit 经验,但我发现很难让一些基本的东西发挥作用。
例如,我试图isLoggedIn
在我的 ViewModel 上添加一个属性,它应该简单地“转发”UserManager
类的isLoggedIn
属性。对于 ReactiveKit,这是相当微不足道的,但对于 SwiftUI/Combine,我无法工作。该值仅设置一次,然后不再更新。
class UserManager: ObservableObject {
@Published private(set) var isLoggedIn = false
// This class has all the actual logic for logging in,
// keeping track of the logged in user and the auth status, etc.
}
class ViewModel: ObservableObject {
@Published var isLoggedIn = false
private let userManager: UserManager
init(userManager: UserManager) {
self.userManager = userManager
isLoggedIn = userManager.isLoggedIn // <- this doesn't work
userManager.$isLoggedIn.assign(to: \.isLoggedIn, on: self) // <- neither does this
}
func logout() {
userManager.logout()
}
}
struct ContentView: View {
@ObservedObject var viewModel: ViewModel
var body: some View {
// this will use viewModel.isLoggedIn at some point
}
}
Run Code Online (Sandbox Code Playgroud)
以下应该有效。如果您不存储订阅者,它会自动取消。
private var subscribers = [AnyCancellable]()
init(userManager: UserManager) {
self.userManager = userManager
userManager.$isLoggedIn
.assign(to: \.isLoggedIn, on: self)
.store(in: &subscribers) // << subscriber must be kept
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
574 次 |
最近记录: |