gpt4 book ai didi

swiftui - 如何 "forward"@Published 值

转载 作者:行者123 更新时间:2023-12-04 15:36:30 29 4
gpt4 key购买 nike

我对 SwiftUI 和 Combine 非常陌生,尽管我对 Swift 有丰富的经验,并且对 ReactiveKit 有一些了解,但我发现很难让一些基本的东西发挥作用。

例如,我试图添加一个 isLoggedIn我的 ViewModel 上的属性,它应该简单地“转发” UserManager类(class)'isLoggedIn属性(property)。使用 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
}
}

最佳答案

以下应该工作。如果您不存储订阅者,它会自动取消。

  private var subscribers = [AnyCancellable]()
init(userManager: UserManager) {
self.userManager = userManager
userManager.$isLoggedIn
.assign(to: \.isLoggedIn, on: self)
.store(in: &subscribers) // << subscriber must be kept
}

关于swiftui - 如何 "forward"@Published 值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59568889/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com