如何“转发"@Published 值 [英] How to "forward" a @Published value

查看:22
本文介绍了如何“转发"@Published 值的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我对 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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆