首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何“转发”@Published值

如何“转发”@Published值
EN

Stack Overflow用户
提问于 2020-01-03 03:22:43
回答 2查看 223关注 0票数 3

我对SwiftUI和Combine非常陌生,尽管我在使用Swift和ReactiveKit方面有很多经验,但我发现很难让一些基本的东西正常工作。

例如,我正试图在我的ViewModel上添加一个isLoggedIn属性,它应该只是“转发”UserManager类的isLoggedIn属性。在ReactiveKit中,这是相当琐碎的,但在SwiftUI/Combine中,我无法获得工作。该值只设置一次,然后再也不会更新。

代码语言:javascript
复制
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
  }
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-01-03 03:36:53

下面的方法应该是可行的。如果你不存储订阅者,它会自动取消。

代码语言:javascript
复制
  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
EN

Stack Overflow用户

发布于 2020-10-23 03:52:34

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

代码语言:javascript
复制
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()
    }
  }

}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59568889

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档