可见未响应.drive方法

时间:2018-07-14 20:11:34

标签: ios swift reactive-programming rx-swift

在我的应用程序中,我有一个视图依赖于持久性存储中的值。在会话中的第一次(杀死应用程序后安装或打开),该值将保存到永久性存储中并正确显示。但是,如果我注销并重新登录(同一会话),则该视图将不包含持久存储中的值。

我有理由相信我对viewmodel中可观察到的“用户”的订阅存在问题,但是我不确定。

我插入了打印语句,发现.map函数的关闭在这种情况下甚至不会触发。有什么想法吗?

MyViewController.swift

let myView: MyView
private let viewModel: MyViewModel

override init() {
    ...
    viewModel = MyViewModel(...)
}

override func viewDidLoad(){
    ...
viewModel.potentialEarnings.drive(myView.rx.potentialEarnings).disposed(by: disposeBag)
}

MyViewModel.swift

let potentialEarnings: Driver<String>

init() {
    ...
    potentialEarnings = User.currentUser(in: getBackgroundContext).map({
      user -> String? in
      let earnings = user.potentialEarnings
      return earnings
    }).unwrap().asDriver(onErrorJustReturn: "")
}

MyView.swift

extension Reactive where Base : MyView {
 var potentialEarnings: Binder<String> {
  return Binder(self.base) { myView, potentialEarnings in
    myView.topLabel.text = "Some Text with: \(potentialEarnings)"
  }
 }
}

1 个答案:

答案 0 :(得分:0)

看来您的视图控制器仅订阅viewDidLoad,但是如果在注销/登录时取消了订阅,则不会再获得任何元素。由于viewDidLoad仅触发一次(假设您不重新创建视图控制器),因此您将不会重新订阅。

尝试添加.debug("potential earnings driver"),例如:

viewModel.potentialEarnings
    .debug("potential earnings driver")
    .drive(myView.rx.potentialEarnings)
    .disposed(by: disposeBag)

并检查控制台是否/何时取消订阅。