如何“转发”@Published 值

Kev*_*ers 5 swiftui combine

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

例如,我试图isLoggedIn在我的 ViewModel 上添加一个属性,它应该简单地“转发”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
  }
}
Run Code Online (Sandbox Code Playgroud)

Asp*_*eri 4

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

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