在官方的RxSwift documentation中,描述了trait DriverControlProperty在它们之间有很多相似之处(不能出错,观察在主调度程序上发生,共享和重放副作用),但是同时在示例中提供的ControlProperty rx.text是被包裹在驱动程序中。

因此,问题将是:

  • ControlProperty包装到Driver特征中有真正的优势吗?
  • 如果默认情况下应该同时共享和重播ControlPropertyDriver,为什么在第一个代码中而不是在第二个代码中调用.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)
    

    谢谢,最好的问候!

    最佳答案

    在第一个示例中,使用的throttle返回一个Observable。

    在第二个示例中,由于存在asDriver()调用,因此使用了另一个throttle来返回驱动程序(即SharedSequence<DriverSharingStrategy, String>)

    您的困惑可能是由于RxSwift库中有两个throttle函数。一个是ObservableType的扩展(ControlProperty是ObservableType的扩展),而另一个是SharedSequenceConvertibleType的扩展(Driver是该扩展)。

    关于ios - RxSwift-为什么将ControlProperty特性包装到驱动程序中?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/55012126/

    10-14 23:08