Следующий код работает для меня, основываясь на ответе прекса.Пожалуйста, не стесняйтесь исправлять или предлагать какие-либо улучшения.
RxSwift / RxCocoa 4.4, iOS 12, Xcode 10
private let _disposeBag = DisposeBag()
let viewModel: ViewModel ...
let switchControl: UIControl ...
let observable = switchControl
.rx.isOn
.changed // We want user-initiated changes only.
.distinctUntilChanged()
.share(replay: 1, scope: .forever)
observable
.subscribe(onNext: { [weak self] value in
self?.viewModel.setSomeOption(value)
})
.disposed(by: _disposeBag)
В этом примере мы уведомляемся, когда пользователь (и только пользователь)) изменяет состояние UISwitch
.Затем мы обновляем viewModel
.
. В свою очередь, всем наблюдателям viewModel
будет сообщено об изменении состояния, что позволит им обновить пользовательский интерфейс и т. Д.
например
class ViewModel
{
private var _someOption = BehaviorRelay(value: false)
func setSomeOption(_ value: Bool) { _someOption.accept(value) }
/// Creates and returns an Observable on the main thread.
func observeSomeOption() -> Observable<Bool>
{
return _someOption
.asObservable()
.observeOn(MainScheduler())
}
}
...
// In viewDidLoad()
self.viewModel
.observeSomeOption()
.subscribe(onNext: { [weak self] value in
self?.switchControl.isOn = value
// could show/hide other UI here.
})
.disposed(by: _disposeBag)
См .: https://stackoverflow.com/a/53479618/1452758