MVVM中的ViewModel在是一个视图逻辑的集中地。在MVC的时候我们做购物车的时候,多少会将一部分视图逻辑写在ViewController或者View里,如果是有TableView的就很有可能写在Cell里面。代码臃肿是一个,更重要的是不方便修改维护和实现单元测试。举个场景,如果界面要大改了,tableViewCell这个类要删除重建,本来界面的改动应该不涉及到逻辑的修改的,但是因为代码写在了Cell中,所以一些不该改动的都要多少触动一下,这个改动带来了更大的风险成本,如果我把这些都放在一个地方,不单只可以解决刚才的问题,我以后修改逻辑就不用到处找,更加的方便,这听起来,ViewModel的作用在我的理解更像是一个界面的封装类库。
接下来我将介绍如何实现基于MVVM的购物车界面。
典型的购物车界面看起来是这样的
override func awakeFromNib() {
super.awakeFromNib()
weak var weakself = self
choseButton.setBlockForControlEvents(.TouchUpInside) { (btn) in
let temp = btn as! UIButton
if let tempModel = weakself?.model {
weakself?.vm.productSelect(tempModel, isSelect: !temp.selected)
}
}
jiaButton.setBlockForControlEvents(.TouchUpInside) { (_) in
if let tempModel = weakself?.model {
weakself?.vm.addProuctNum(tempModel)
}
}
jianButton.setBlockForControlEvents(.TouchUpInside) { (_) in
if let tempModel = weakself?.model {
weakself?.vm.reduceProuctNum(tempModel)
}
}
// Initialization code
}
上面的代码意思是添加按钮对应的事件,然后调用ViewModel中的方法去处理逻辑。题外说一个,setBlockForControlEvents是YYKit里面的方法,swift中的extension中不可以像OC那样通过runtime添加block了(反正我是没找到方法),所以用OC去实现。
然后很简单,在ViewModel中添加对应的逻辑就行,很简单,等我我会放出Demo。
我没有用实现不同Cell或者View之间的通信来处理商品的选择功能,因为我用到RxSwift去构建整个项目,这样的话,我需要创建存储几个信号并在tableView滑动的过程中不断的处理解绑和绑定得操作,所以用到reloadData的方法,会简单很多。
总结
MVVM的设计很大程度上使代码更容易修改维护,代码结构更加的清晰,更加的方便在自己被解雇后别人接手更容易,还有一个是容易写测试单元。这个在项目的开发过程中深有体会。然后这是呆萌 Demo。
项目中使用设计模式不要忘记我们的初衷,就是:帮我们解决问题。而这里面又有一个前提:不大量增加工作量且效果明显。
其实想构建好的代码的方法有多种,我所想的未必是最好的,但也应该不算差,这个需要在工作的不断的实践思考还有向其他人学习。