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。
項目中使用設計模式不要忘記我們的初衷,就是:幫我們解決問題。而這里面又有一個前提:不大量增加工作量且效果明顯。
其實想構建好的代碼的方法有多種,我所想的未必是最好的,但也應該不算差,這個需要在工作的不斷的實踐思考還有向其他人學習。