iOS應用千萬級架構:MVVM框架

業務模塊內的MVC和MVVM架構

目前,惟品會中MVC和MVVM架構並存,後期會偏重於MVVM架構的使用。前端

MVC架構

Model:程序中要操縱的實際對象的抽象,爲Controller提供通過抽象的業務數據,供Controller調度git

View:視圖,負責界面的元素的展現github

Controller:控制器,管理View的聲明週期及子view的生成和組裝,負責Model和View之間的通訊。網絡

MVC框架的優點:
1. 應用普遍,幾乎全部前端語言都有相似MVC的設計痕跡
2. 設計思想很是簡潔,學習成本很低,新人上手很是容易。架構

MVC框架的問題:
MVC並無對數據請求和處理邏輯代碼應該放在哪一層作出明確地劃分,所以一旦頁面邏輯或交互稍微複雜,Controller就會變得很臃腫,代碼也就愈來愈難維護。框架

MVVM架構

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的存在形同虛設, 反而增長了維護的成本。優化

咱們爲何要用MVVM?

訂單售後這個頁面內容很是多,並且裏面的內容會變,還能夠收縮展開,還會出現由接口請求成功或失敗來控制某一部分的顯示仍是隱藏。當你使用普通的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使用

  1. 新建一個控制器VSDemoCollectionViewController,繼承於VSMVVMCollectionViewController
  2. 新建一個該控制器的ViewModel(VSDemoCollectionViewModel),繼承於VSMVVMCollectionViewModel,負責管理全部的CellViewModel
  3. 新建一個CellModel(VSDemoCollectionItemCellModel),繼承於VSMVVMCollectionViewCellModel,負責管理元素Cell,在方法cellClass中,返回關聯的Cell(VSDemoCollectionItemCell)
  4. 新建一個Cell(VSDemoCollectionItemCell),繼承於VSMVVMCollectionViewCell,須要重寫VSMVVMCollectionViewCell中的方法,返回該cell的高度。
  5. 頁面很複雜,須要從新步驟3和4,不斷的拆分這個複雜的Cell.
  6. 最後,全部的cellModel都交由第2步的控制器的ViewModel整合加載。

源代碼

代碼Demo已經上傳到github: https://github.com/jiangys/VSMVVM 

相關文章
相關標籤/搜索