问题
I am very new to SwiftUI and Combine, and even though I have plenty of experience with Swift, and a bit with ReactiveKit, I am finding it hard to get some basic stuff to work.
For example, I am trying to add an isLoggedIn
property on my ViewModel, which should simply "forward" the UserManager
class' isLoggedIn
property. With ReactiveKit this is rather trivial but with SwiftUI/Combine I can't get is to work. The value is only set once, and then never updated again.
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
}
}
回答1:
The following should work. If you don't store subscriber it cancelled automatically.
private var subscribers = [AnyCancellable]()
init(userManager: UserManager) {
self.userManager = userManager
userManager.$isLoggedIn
.assign(to: \.isLoggedIn, on: self)
.store(in: &subscribers) // << subscriber must be kept
}
来源:https://stackoverflow.com/questions/59568889/how-to-forward-a-published-value