swift - 如何在不创建无限循环的情况下让 RxSwift 中的主题将值推送给自身

标签 swift reactive-programming rx-swift

我有一个 UITableView,如果满足某些条件,我想将其置于编辑状态。切换编辑的主要方式是通过编辑按钮。

所以我的 View 元素是

let tableView = UITableView()
let editButton = UIButton()

以及 tableView 是否应该处于编辑模式的信息来自:

let editing = BehaviorSubject(value: false)

它将使用如下方式连接到 tableView:

editing.subscribeNext { isEditing in
  tableView.setEditing(isEditing, animated: true)
}

点击编辑按钮时,我希望将新值推送到 editing,即对发送到 editing 的最新值取反。最近的值可能是通过点击 editButton 设置的,或者它可能来自其他地方。

我不明白如何将按钮按下的流与编辑的流结合起来,这样就不会出现无限循环,例如

Obervable.combineLatest(editButton.rx_tap.asObservable(), editing) { _, isEditing in
  editing.onNext(!isEditing)
}

我知道 tableView 有一个 editing 属性,但我不想依赖它,因为我正在寻找可以在别处重复使用的更通用的解决方案。我也不打算在实例 var 中跟踪 isEditing 的值,甚至作为 Variable(),因为我正在寻找一种无状态的、基于流的解决方案(如果可能的话)。

谢谢!

最佳答案

在 RxSwift GitHub 问题论坛的帮助下,我现在已经解决了 :)。关键是 withLatestFrom。我在下面包含了一个示例,以防它对其他人有所帮助。 editButton 是触发编辑模式打开或关闭的主要方式,我将通过 tableView.rx_itemSelected 发送的事件作为附加输入示例(在本例中,我希望编辑在任何时候选择一个项目时结束)。

let isEditing = BehaviorSubject(value: false)
let tableView = UITableView()
let editButton = UIButton()

tableView.rx_itemSelected
  .map { _ in false }
  .bindTo(isEditing)

editButton.rx_tap.withLatestFrom(isEditing)
  .map { !$0 }
  .bindTo(isEditing)

isEditing.subscribeNext { editing in
  tableView.setEditing(editing, animated: true)
}

注意:每次选择一个项目时,此解决方案都会将 .Next(false) 发送到 isEditing,即使表格当前未处于编辑模式。如果您觉得这是一件坏事,并且想要过滤 rx_itemSelected 以仅在表格实际处于编辑模式时发送 .Next(false),您可以这样做使用 withLatestFromfilter 的组合。

关于swift - 如何在不创建无限循环的情况下让 RxSwift 中的主题将值推送给自身,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35329892/

相关文章:

ios - 请求访问照片库的提示留在后台

angularjs - 与 Angularjs 1.X 中的 $watch 相比,rxjs observable 的性能如何?

swift - 如何从另一个 Controller 快速调用函数

angular - 是否有可以在组件内部使用的等效异步管道?

java - 我怎样才能使这个 rxjava zip 并行运行?

swift - RxSwift 异步请求设计

swift - 在 RxSwift 中,我如何对一个可观察对象没有发送任何事件进行单元测试?

ios - RxSwift flatMapLatest 无需处理以前的可观察值

ios - 删除 UISearchBar 中搜索图标的动画

swift - 如何在Segue之前添加Admob Interstitial?