如何让RxSwift中的主题将值推送到自身而不创建无限循环

时间:2016-02-11 02:44:01

标签: swift reactive-programming rx-swift

我有一个UITableView,如果满足某些条件,我想进入编辑状态。切换编辑的主要方法是通过编辑按钮。

所以我拥有的视图元素是

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设置的,或者可能来自其他地方。

我不明白如何将按钮按下的流与editing的流组合在一起,以便在没有无限循环的情况下进行此操作,例如。

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

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

谢谢!

2 个答案:

答案 0 :(得分:2)

在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的组合来执行此操作ffplay f0000000001.tif

答案 1 :(得分:1)

如果您将editing定义为Variable而不是BehaviourSubject,该怎么办?在这种情况下,Variable无法出错。声明如下:

let editing = Variable(value: false)

您可以订阅按钮点击并将editing的值更改为当前否定的值:

editButton.rx_tap.asObservable().subscribeNext { editing.value = !editing.value }

通过更改value的{​​{1}}属性,此方法称为

editing

所有这些都未经过测试,但可能会引导您找到正确的解决方案。