Rx之java , swift, kotlin,等 家族越来越壮大不必自然多说,
记录一下MVVM之Variable数据绑定PublishSubject强大之处
-
比如:要实现一个很简单的给
视图赋值
的需求 -
原来MVVM三层的代码可能是这样的:
/**
* 视图
*/
class View: UIView {
var label:UILabel = UILabel()
var model:Model?{
didSet{
label.text = model?.title
}
}
}
/**
* 模型
*/
class Model: NSObject {
var title = ""
}
/**
* 逻辑处理
*/
class ViewModel:NSObject{
func getDataModel() -> Observable<Model> {
return Observable.create({ (subscriber) -> Disposable in
let model = Model()
model.title = "variable title"
subscriber.onNext(model)
subscriber.onCompleted()
return Disposables.create {}
})
}
}
/**
* controller
*/
class Controller: UIViewController {
let vm = ViewModel()
var dispose = DisposeBag()
override func viewDidLoad() {
super.viewDidLoad()
let view = View()
self.view.addSubview(view)
//这里总感觉不够优雅
vm.getDataModel().subscribe(onNext: { model in
view.model = model
}).disposed(by: dispose)
}
}
- 使用Variable改造后的代码是这样的:
/**
* 视图
*/
class View: UIView {
var label:UILabel = UILabel()
// var model:Model?{
// didSet{
// label.text = model?.title
// }
// }
/**
* 设置数据模型
*/
var rx_Model: Variable<Model> = Variable(Model())
}
/**
* 数据
*/
class Model: NSObject {
var title = ""
}
/**
* 逻辑处理
*/
class ViewModel:NSObject{
func getDataModel() -> Observable<Model> {
return Observable.create({ (subscriber) -> Disposable in
let model = Model()
model.title = "variable title"
subscriber.onNext(model)
subscriber.onCompleted()
return Disposables.create {}
})
}
}
一直有感觉Controller里面的订阅赋值有点变扭,技术不好继续改造...
/**
* controller
*/
class Controller: UIViewController {
let vm = ViewModel()
var dispose = DisposeBag()
override func viewDidLoad() {
super.viewDidLoad()
let view = View()
self.view.addSubview(view)
//这里总感觉不够优雅
// vm.getDataModel().subscribe(onNext: { model in
// view.model = model
// }).disposed(by: dispose)
//直接将ViewModel和View需要的数据源绑定起来
vm.getDataModel().bind(to: view.rx_Model).disposed(by: dispose)
}
}
码了这么多,就为了解决这一句话,码农不易😄,
有更好解决方案的同学,欢迎留言...
网友评论