我对RxSwift非常陌生,并尝试执行以下操作:
我的应用程序需要启用“元素”的选择,其中选择模式可以是single
选择(新选择替换旧选择)或multiple
,其中将选择添加到任何旧选择
在single
模式下,如果新选择是旧选择,则我的选择结果必须为空(通过选择相同元素来切换选择)。
在multiple
模式下,如果新选择是旧选择的一部分,则新选择的元素将从当前选择中删除。
我有三个现有的主题:selectionModeSubject
是一个BehaviorSubject
,包含single
或multiple
枚举。 selectSubject
代表用户请求的新选择,它是PublishSubject
。最后,currentSelectionSubject
,一个BehaviorSubject
,其中包含所选的当前元素集。
在currentSelectionSubject
被触发后,我试图让selectSubject
包含结果选择。
这是我所拥有的:
Observable
.combineLatest(selectionModeSubject, selectSubject, currentSelectionSubject) { (mode, newSelection, currentSelection) -> Set<Element> in
switch mode {
case .single:
if currentSelection.contains(newSelection) {
return Set([newSelection])
} else {
return Set<Element>()
}
case .multiple:
if currentSelection.contains(newSelection) {
return currentSelection.filter({ (element) -> Bool in
return element != newSelection
})
} else {
return currentSelection.union(Set([newSelection]))
}
}
}
.bind(to: currentSelectionSubject)
.disposed(by: disposeBag)
我的新手RxSwift状态进一步放大了这个问题,即当selectionModeSubject
或currentSelectionSubject
触发时,此观察代码可能会触发。我只希望更改selectSubject
时触发。
我试图在.distinctUntilChanged()
上插入selectSubject
,但似乎无法理解。
任何提示将不胜感激。
答案 0 :(得分:0)
withLatestFrom
是必经之路。
selectSubject.withLatestFrom(
Observable
.combineLatest(selectionModeSubject, currentSelectionSubject)) { newSelection, pair in
let (mode, currentSelection) = pair
return (mode, newSelection, currentSelection)
}.map { (mode, newSelection, currentSelection) -> Set<Element> in
switch mode {
case .single:
if currentSelection.contains(newSelection) {
return Set([newSelection])
} else {
return Set<Element>()
}
case .multiple:
if currentSelection.contains(newSelection) {
return currentSelection.filter({ (element) -> Bool in
return element != newSelection
})
} else {
return currentSelection.union(Set([newSelection]))
}
}
}
.bind(to: currentSelectionSubject)
.disposed(by: disposeBag)