RxSwift - зачем заключать черту ControlProperty в драйвер? - PullRequest
2 голосов
/ 06 марта 2019

В официальной документации 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)

Спасибо и всего наилучшего!

1 Ответ

1 голос
/ 06 марта 2019

В первом примере используемый throttle возвращает Observable.

Во втором примере из-за вызова asDriver() используется другой throttle, который возвращает драйвер (т. Е. SharedSequence<DriverSharingStrategy, String>)

Ваша путаница, вероятно, связана с тем, что в библиотеке RxSwift есть две throttle функции. Один является расширением ObservableType (ControlProperty является расширением ObservableType), тогда как другой является расширением SharedSequenceConvertibleType (Driver является расширением этого.)

...