Вот кое-что, что я написал некоторое время назад и воспроизвел ниже. Если вы посмотрите на мою суть (https://gist.github.com/dtartaglia/1a70c4f7b8960d06bd7f1bfa81802cc3), то увидите, что я изначально написал ее как пользовательский оператор. Позже я узнал, что комбинация встроенных операторов, приведенных ниже, выполняет ту же работу.
Если больше ничего, оглядываясь на более ранние ревизии в сущности, вы поймете, как писать свои собственные операторы.
extension ObservableType {
/**
Filters the source observable sequence using a trigger observable sequence producing Bool values.
Elements only go through the filter when the trigger has not completed and its last element was true. If either source or trigger error's, then the source errors.
- parameter trigger: Triggering event sequence.
- returns: Filtered observable sequence.
*/
func filter(if trigger: Observable<Bool>) -> Observable<E> {
return withLatestFrom(trigger) { (myValue, triggerValue) -> (E, Bool) in
return (myValue, triggerValue)
}
.filter { (myValue, triggerValue) -> Bool in
return triggerValue == true
}
.map { (myValue, triggerValue) -> E in
return myValue
}
}
}
Если вы хотите изменить действие кнопки в зависимости от значения наблюдаемого элемента управления, настройте два фильтра. Обычно фильтр проходит через касания только тогда, когда enableButtons
испускает значение true. Используйте карту, чтобы повернуть ее вспять во втором случае и нажмите кнопку прямого перехода по другому пути:
button.rx.tap.filter(if: enableButtons)
.subscribe(onNext: { /* do one thing when enableButtons emits true */ }
.disposed(by: bag)
button.rx.tap.filter(if: enableButtons.map { !$0 })
.subscribe(onNext: { /* do other thing when enable buttons emits false*/ }
.disposed(by: bag)