Swiftui 如何";“前进”;a@公布的价值

Swiftui 如何";“前进”;a@公布的价值,swiftui,combine,Swiftui,Combine,我对SwiftUI和Combine非常陌生,尽管我对Swift有丰富的经验,对ReactiveKit也有一点了解,但我发现很难让一些基本的东西发挥作用 例如,我试图在我的ViewModel上添加一个isLoggedIn属性,它应该只是“转发”UserManagerclass'isLoggedIn属性。对于ReactiveKit,这相当简单,但是对于SwiftUI/Combine,我无法让它工作。该值只设置一次,然后再也不会更新 class用户管理器:observeObject{ @已发布私有(集

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

例如,我试图在我的ViewModel上添加一个
isLoggedIn
属性,它应该只是“转发”
UserManager
class'
isLoggedIn
属性。对于ReactiveKit,这相当简单,但是对于SwiftUI/Combine,我无法让它工作。该值只设置一次,然后再也不会更新

class用户管理器:observeObject{
@已发布私有(集合)变量isLoggedIn=false
//这个类拥有所有实际的登录逻辑,
//跟踪登录用户和身份验证状态等。
}
类ViewModel:ObservableObject{
@已发布的var isLoggedIn=false
私有let userManager:userManager
init(userManager:userManager){
self.userManager=userManager

isLoggedIn=userManager.isLoggedIn/以下功能应该可以正常工作。如果不存储订阅服务器,它将自动取消

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

.store(in:&subscribers)/另一种方法是用手动objectWillChange替换ViewModel中的@Published var isLoggedIn

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()
    }
  }

}

谢谢,这很有道理。