談到MVVM不得不先說一下MVC,MVC(Model-View-Controller)。
Model模型:用來呈現數據。
View視圖:用來呈現用戶界面。
Controller控制器:用來調節模型與視圖之間的交互。
在 iOS 應用中日益增長的重量級視圖控制器的問題。在典型的 MVC 應用里, 許多邏輯被放在 View Controller 里。
它們中的一些確實屬於 View Controller,但更多的是所謂的“表示邏輯(presentation logic),為了不讓控制器日益增大,便於測試管理,便出現了MVVM。
MVVM:它其實是一個 MVC 的增強版,並將表示邏輯從 Controller 移出放到一個新的對象里,即 View Model。
在 iOS 上使用 MVVM 的動機,就是讓它能減少 View Controller 的復雜性並使得表示邏輯更易於測試。
ViewModel: 它位於 View/Controller 與 Model 之間。
代碼示例:
1、首先是model層的代碼,基於JSONModel封裝了BaseModel類(基類:以后的Model都可繼承此類),繼承自BaseModel,實現HomeModel類。
2、然后是View層的代碼,View層控件全部用懶加載方式,盡可能減少內存消耗,不喜歡用XIB,所以習慣純代碼編寫。
3、接下來看ViewModel層,對封裝好的NetWork進行處理,request網絡數據存儲在HomeModel里,最后將數據用Block帶出去,方便在VC中使用數據,reloadData。
4、最終,HomeViewController 將會變得非常輕量級:
怎么樣?其實 MVVM 並沒有想像中的那么難吧,而且更重要的是它也沒有破壞 MVC 的現有結構,只不過是移動了一些代碼,僅此而已。總結下 MVVM 相比 MVC 到底有哪些好處呢?
主要可以歸納為以下三點:
1、由於展示邏輯被抽取到了 viewModel 中,所以 view 中的代碼將會變得非常輕量級;
2、由於 viewModel 中的代碼是與 UI 無關的,所以它具有良好的可測試性;
3、對於一個封裝了大量業務邏輯的 model 來說,改變它可能會比較困難,並且存在一定的風險。在這種場景下,viewModel 可以作為 model 的適配器使用,從而避免對 model 進行較大的改動。
通過前面的示例,我們對第一點已經有了一定的感觸,至於第三點,可能對於一個復雜的大型應用來說,才會比較明顯。
綜上所述,我們只要將 MVC 中的 controller 中的展示邏輯抽取出來,放置到 viewModel 中,然后通過一定的技術手段,來同步 view 和 viewModel ,就完成了 MVC 到 MVVM 的轉變。