我对SwiftUI和Combine非常陌生,尽管我在使用Swift和ReactiveKit方面有很多经验,但我发现很难让一些基本的东西正常工作。
例如,我正试图在我的ViewModel上添加一个isLoggedIn属性,它应该只是“转发”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
}
}发布于 2020-01-03 03:36:53
下面的方法应该是可行的。如果你不存储订阅者,它会自动取消。
private var subscribers = [AnyCancellable]()
init(userManager: UserManager) {
self.userManager = userManager
userManager.$isLoggedIn
.assign(to: \.isLoggedIn, on: self)
.store(in: &subscribers) // << subscriber must be kept
}发布于 2020-10-23 03:52:34
另一种方法是将ViewModel中的@Published var isLoggedIn替换为手动objectWillChange。
class ViewModel: ObservableObject {
var isLoggedIn: Bool {userManager.isLoggedIn}
private let userManager: UserManager
private var anyCancellable: AnyCancellable?
init(userManager: UserManager) {
self.userManager = userManager
anyCancellable = userManager.objectWillChange.sink {[weak self] _ in
self?.objectWillChange.send()
}
}
}https://stackoverflow.com/questions/59568889
复制相似问题