我正在使用RxSwift绑定视图模型和视图,并且我有大约10个驱动程序在我的视图模型中公开属性:
let title: Driver<String>
let description: Driver<String>
let price: Driver<String>
...
从传入的模型序列中驱动这些可观测数据的最佳方法是什么?观察每个司机的到来是最好的吗?这是一种奇怪/低效的做事方式吗?
self.title = incoming.productObservable.map({ $0.title }).asDriver(onErrorJustReturn: "")
self.description = incoming.productObservable.map({ $0.description }).asDriver(onErrorJustReturn: "")
self.price = incoming.productObservable.map({ $0.price }).asDriver(onErrorJustReturn: "")
...
除了创建私有变量,订阅可观察模型,在每个下一个事件上设置变量,然后必须从变量创建另一组公共驱动程序/可观察对象之外,我想不出更好的方法来完成这项工作,即:
let titleDriver: Driver<String>
private let title = Variable<String>("")
...
titleDriver = title.asDriver()
但我讨厌每个属性所需的重复和大量的代码!
我希望确保我不会从视图模型外部公开Variable
,因为您不希望任何人使用它们!
发布于 2017-02-12 19:27:03
我没有尝试过,但我会这样做:
您的模型:
struct Product {
let title: String
let description: String
let price: String
// ...
}
然后,我将使用不同的UILabel
(或UIWhateverYouWant
)创建一个UIView
子类。
final class ProductDetailView: UIView {
// MARK: - Properties
var product: Product? {
didSet {
didSetProduct()
}
}
fileprivate var titleLabel = UILabel()
fileprivate var descriptionLabel = UILabel()
fileprivate var priceLabel = UILabel()
// ...
fileprivate var disposeBag = DisposeBag()
// MARK: - Initialization
init() {
super.init(frame: CGRect.zero)
}
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
}
}
和一个扩展:
private extension ProductDetailView {
func didSetProduct() {
guard let product = product else { return }
// Bind the result to our observer property
Observable.just(product)
.bindTo(productObserver)
.addDisposableTo(disposeBag)
}
/// A bindable observer for product
var productObserver: AnyObserver<Product> {
return UIBindingObserver(UIElement: self) { detailView, product in
detailView.titleLabel.text = product.title
detailView.descriptionLabel.text = product.description
detailView.priceLabel.text = product.price
}.asObserver()
}
}
您的viewModel
将具有Observable<Product>
属性(或Driver<Product>
)
最后,在您的viewController
中,您将有一个对ProductDetailView
的引用。例如:
class viewController: UIViewController {
@IBOutlet private weak var detailView: ProductDetailView!
// ...
override func viewDidLoad() {
super.viewDidLoad()
viewModel.product
.bindTo(detailView.productObserver)
.addDisposableTo(db)
}
}
https://stackoverflow.com/questions/42191460
复制