在官方的RxSwift documentation中,描述了trait 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)
谢谢,最好的问候!
最佳答案
在第一个示例中,使用的throttle
返回一个Observable。
在第二个示例中,由于存在asDriver()
调用,因此使用了另一个throttle
来返回驱动程序(即SharedSequence<DriverSharingStrategy, String>
)
您的困惑可能是由于RxSwift库中有两个throttle
函数。一个是ObservableType的扩展(ControlProperty是ObservableType的扩展),而另一个是SharedSequenceConvertibleType
的扩展(Driver是该扩展)。
关于ios - RxSwift-为什么将ControlProperty特性包装到驱动程序中?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/55012126/