目前,惟品會中MVC和MVVM架構並存,後期會偏重於MVVM架構的使用。前端
Model:程序中要操縱的實際對象的抽象,爲Controller提供通過抽象的業務數據,供Controller調度git
View:視圖,負責界面的元素的展現github
Controller:控制器,管理View的聲明週期及子view的生成和組裝,負責Model和View之間的通訊。網絡
MVC框架的優點:
1. 應用普遍,幾乎全部前端語言都有相似MVC的設計痕跡
2. 設計思想很是簡潔,學習成本很低,新人上手很是容易。架構
MVC框架的問題:
MVC並無對數據請求和處理邏輯代碼應該放在哪一層作出明確地劃分,所以一旦頁面邏輯或交互稍微複雜,Controller就會變得很臃腫,代碼也就愈來愈難維護。框架
MVVM框架是在MVC的基礎上演化而來,MVVM想要解決的問題是儘量地減小Controller的任務。佈局
Model:程序中要操縱的實際對象的抽象
View(ViewController):MVVM中的View再也不是UIView的子類,而變成了UIViewController的子類。這裏的View實際上就是MVC中剝離了處理呈現View邏輯部分的Controller,所以它仍然有各類UIView的屬性,仍然有ViewController的聲明週期的各類方法,可是這裏的Controller再也不負責數據的請求以及處理邏輯,所以再也不臃腫。
ViewModel:MVVM中,ViewModel代替了MVC中的Controller成爲了協調者的角色,ViewModel被View(ViewController)持有,同時持有者Model。數據請求以及處理邏輯都放在ViewModel中,View(ViewController)就瘦了下來。學習
MVVM框架的優點:
1. View(ViewController)經過對ViewModel中的數據進行綁定來更新界面,不用經過邏輯或者條件判斷來更新view,大大下降了複雜交互時出bug的概率。
2. View(ViewController)中代碼簡潔,後期的維護和優化比較容易。測試
MVVM框架的問題:
學習成本比MVC高,若是對MVVM的職責劃分理解不透徹,很容易致使ViewModel的存在形同虛設, 反而增長了維護的成本。優化
訂單售後這個頁面內容很是多,並且裏面的內容會變,還能夠收縮展開,還會出現由接口請求成功或失敗來控制某一部分的顯示仍是隱藏。當你使用普通的MVC架構的時候,你會發現,在controller裏的代碼量很是驚人的,View的計算也很是複雜,當有一塊內容要在中間展現的時候,下面的全部的View的Y值都得從新計算。顯然,維護成本是很是高的,改動一個小點還可能會致使蝴蝶效應,測試也要回歸當前頁面全部的用例。
那有沒有好的辦法來解決這些問題呢?我只想在本身的小塊里加功能,當小塊的內容高度變化了,整個頁面的佈局高度跟着本身變化呢。答案是有的,那就是使用MVVM模式。
看下圖的UML類圖,分析一下,以下:
下面就CollectionView作說明,每個內容都是一個小塊Cell,都有本身的cellViewmodel,整個控制器有一個大的viewmodel,包裝全部的cellViewmodel,就這樣構建一個頁面。
一、itemCell 是小塊Cell,裏面主要是初始化View,更新View的數據,須要返回cell的寬高
二、cellViewModel,是itemCell的ViewModel,給itemCell 提供數據,itemCell的點擊事件也是回調到cellViewModel中。
三、Cell1ViewModel 和 item1Cell 組成一個小塊Cell1
四、Cell2ViewModel 和 item2Cell 組成另外一個小塊Cell2
五、ViewModel 網絡請求拿到數據以後,組裝上面的小塊Cell1ViewModel、小塊Cell2ViewModel,經過方法【 - (Class)cellClass 】就能夠拿到當前的itemCell
六、ViewModel中,還經過block的方式,對Controller回調綁定了事件,好比cell的點擊事件、加載數據成功事件、按鈕點擊事件等
Demo有兩種處理方式,一是經過繼承基類,重寫基類的方法來實現;二是經過協議,cell使用cellprotocol協議,cellModel使用cellModelProtocol協議。
直接繼承MVVMBase使用
代碼Demo已經上傳到github: https://github.com/jiangys/VSMVVM