В официальной документации RxSwift описывается, что черты Driver
и ControlProperty
имеют много общего между ними (ошибки не выявляются, наблюдения происходят в главном планировщике, делятся и воспроизводят побочные эффекты), но в то же время в приведенном примере ControlProperty
rx.text
помещается в драйвер.
Таким образом, вопросы будут:
- Есть ли реальное преимуществоОборачивание
ControlProperty
в черту Driver
? - Если оба
ControlProperty
и Driver
по умолчанию должны совместно использовать и воспроизводить, почему оператор .share(replay: 1)
вызывается в первом коде, но не вызываетсяво втором?
Здесь я прилагаю ссылочный код из документации:
От:
let results = query.rx.text
.throttle(0.3, scheduler: MainScheduler.instance)
.flatMapLatest { query in
fetchAutoCompleteItems(query)
.observeOn(MainScheduler.instance) // results are returned on MainScheduler
.catchErrorJustReturn([]) // in the worst case, errors are handled
}
.share(replay: 1) // HTTP requests are shared and results replayed
// to all UI elements
results
.map { "\($0.count)" }
.bind(to: resultCount.rx.text)
.disposed(by: disposeBag)
results
.bind(to: resultsTableView.rx.items(cellIdentifier: "Cell")) { (_, result, cell) in
cell.textLabel?.text = "\(result)"
}
.disposed(by: disposeBag)
К:
let results = query.rx.text.asDriver() // This converts a normal sequence into a `Driver` sequence.
.throttle(0.3, scheduler: MainScheduler.instance)
.flatMapLatest { query in
fetchAutoCompleteItems(query)
.asDriver(onErrorJustReturn: []) // Builder just needs info about what to return in case of error.
}
results
.map { "\($0.count)" }
.drive(resultCount.rx.text) // If there is a `drive` method available instead of `bind(to:)`,
.disposed(by: disposeBag) // that means that the compiler has proven that all properties
// are satisfied.
results
.drive(resultsTableView.rx.items(cellIdentifier: "Cell")) { (_, result, cell) in
cell.textLabel?.text = "\(result)"
}
.disposed(by: disposeBag)
Спасибо и всего наилучшего!