Я очень новичок в 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
, но, похоже, не могу с этим справиться.
Любые советы будут оценены.