Как объединитьПоследний, только когда конкретная наблюдаемая изменилась - PullRequest
0 голосов
/ 19 февраля 2019

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

Любые советы будут оценены.

1 Ответ

0 голосов
/ 19 февраля 2019

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)
...