【问题标题】:How to "forward" a @Published value如何“转发”@Published 值
【发布时间】:2020-01-02 19:22:42
【问题描述】:

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

例如,我试图在我的 ViewModel 上添加一个isLoggedIn 属性,它应该只是“转发”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
  }
}

【问题讨论】:

    标签: swiftui combine


    【解决方案1】:

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

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

    【讨论】:

    • 谢谢,这很有道理。
    【解决方案2】:

    另一种方法是将 ViewModel 中的 @Published var isLoggedIn 替换为手动 objectWillChange。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-19
      • 1970-01-01
      • 2014-10-18
      • 2021-08-01
      • 1970-01-01
      • 2020-03-13
      相关资源
      最近更新 更多