Rxswift我爱编程

swift ~ MVVM之模型数据绑定

2018-06-13  本文已影响0人  RudyHao

Rx之java , swift, kotlin,等 家族越来越壮大不必自然多说,
记录一下MVVM之Variable数据绑定PublishSubject强大之处

/**
 * 视图
 */
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)
    }
}
/**
 * 视图
 */
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)
    }
}

码了这么多,就为了解决这一句话,码农不易😄,
有更好解决方案的同学,欢迎留言...

上一篇 下一篇

猜你喜欢

热点阅读