RxSwift:如何正确订阅变量

时间:2018-01-23 10:24:16

标签: swift rx-swift

我有两个屏幕:

  1. # install.packages("devtools") devtools::install_github("thomasp85/patchwork") library(ggplot2) p1 <- ggplot(mtcars) + geom_point(aes(mpg, disp)) p2 <- ggplot(mtcars) + geom_boxplot(aes(gear, disp, group = gear)) library(patchwork) p1 + p2 :包含用于从其他视图中选择客户端的文本字段
  2. NewControlTableViewController:第二个视图包含可以选择的列表客户端
  3. enter image description here enter image description here

    两个屏幕共享一个视图模型。

    所以这是我的代码:

    ClientsTableViewController

    每当我查看第一个屏幕时,都会触发事件(空值),然后,在从第二个屏幕选择客户端之后,由于某种原因,没有事件被触发。

2 个答案:

答案 0 :(得分:0)

首先,不推荐使用Variables

您应该使用不需要初始值的PublishRelay,这样在第一个屏幕上订阅时就不会触发它。 继电器的优点是它们不会出错或完成。

struct NewControlViewModel {
  let selectedClient = PublishRelay<Client>()
}

// NewControlTableViewController : viewDidLoad
choisirMandat.rx.tap.subscribe(onNext: { [unowned self] in
  let viewController = /* instantiate vc */

  // Make sure to use the same viewModel
  viewController.viewModel = self.viewModel

  self.present(viewController, animated: true)
}).disposed(by: disposeBag)

self.viewModel.selectedClient.debug().subscribe().disposed(by: self.disposeBag)

// ClientsTableViewController: viewDidLoad
tableView.rx.itemSelected.map { [unowned self] indexPath in
  return self.clients[indexPath.row]
}
.debug("client selected", trimOutput: true)
.do(onNext: { [unowned self] _ in
  self.navigationController?.popToRootViewController(animated: true)
})
.bind(to: self.viewModel.selectedClient)
.disposed(by: self.disposeBag)

另一方面,如果您希望功能齐全,客户端应该也可能来自Rx世界。 第二方面,您可以使用debug()运算符来打印事件。

在RxSwift 4.1中添加了

bind(to:),因此请务必保持最新状态

答案 1 :(得分:-1)

我想我在这里找到了你的问题。你正在做的是

// NewControlTableViewController : viewDidLoad
viewModel.selectedClient.asObservable().subscribe { event in
    debugPrint(event)
}
 // ClientsTableViewController: viewDidLoad

tableView.rx.itemSelected.subscribe(onNext: { indexPath in
    let client = self.clients[indexPath.row]
    debugPrint(client)
    self.viewModel.selectedClient.value = client
    self.navigationController?.popToRootViewController(animated: true)

}).disposed(by: self.disposeBag)

您需要更改此行&#34; self.viewModel.selectedClient.value = client&#34;。您需要使用以前的控制器实例或NewControlTableViewController实例,如self.newControlTableVC.selectedClient.value = client

我认为你试图通过从NewControlTableViewController向ClientsTableViewController发送值来使用viewmodel。

此外,我做了你做过的同样的场景,在我的情况下效果非常好。只要尝试我的方案,如果它不起作用必须有一些小问题。

我希望它可以提供帮助