如何“转发"@Published 值 [英] How to "forward" a @Published value
问题描述
我对 SwiftUI 和 Combine 非常陌生,尽管我对 Swift 有丰富的经验,并且对 ReactiveKit 有一些了解,但我发现很难让一些基本的东西发挥作用.
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.
例如,我试图在我的 ViewModel 上添加一个 isLoggedIn
属性,它应该简单地转发"UserManager
类' isLoggedIn
财产.使用 ReactiveKit 这很简单,但是使用 SwiftUI/Combine 我无法工作.该值仅设置一次,然后不再更新.
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
}
}
推荐答案
以下应该有效.如果您不存储订阅者,它会自动取消.
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
}
这篇关于如何“转发"@Published 值的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!