1. 程式人生 > >MVVM架構的一次實踐

MVVM架構的一次實踐


    

    github地址:https://github.com/shenAlexy/MVVM,喜歡就star一個!

說明:本專案採用MVVM架構,重寫iOS頭條客戶端。轉載請註明出處!


前言:

本例基於AFN封裝了網路請求系列庫,以滿足自己需求,後期易於擴充套件;使用JSONModel解析json資料;每個VC都有自己的ViewModel類用來處理網路請求和其他邏輯處理;使用經典的UITableView展示MVVM架構,適合初學MVVM的coder參考。

簡介:

    MVVM的出現主要是為了解決在開發過程中Controller越來越龐大的問題,變得難以維護,所以MVVM把資料加工的任務從Controller中解放了出來,使得Controller只需要專注於資料調配的工作,ViewModel則去負責資料加工並通過通知機制讓View響應ViewModel的改變。

    MVVM是基於胖Model的架構思路建立的,然後在胖Model中拆出兩部分:Model和ViewModel。ViewModel本質上算是Model層(因為是胖Model裡面分出來的一部分),所以View並不適合直接持有ViewModel,因為ViewModel有可能並不是只服務於特定的一個View,使用更加鬆散的繫結關係能夠降低ViewModel和View之間的耦合度。

    在一個典型的 MVC 應用中,controller 由於承載了過多的邏輯,往往會變得臃腫不堪,所以 MVC 也經常被人調侃成 Massive View Controller。(Massive譯:大量的、巨大的、臃腫不堪的)

    因此,一種可以很好地解決 Massive View Controller 問題的辦法就是將 controller 中的展示邏輯抽取出來,放置到一個專門的地方,而這個地方就是 viewModel 。其實,我們只要在上圖中的 M-VC 之間放入 VM ,就可以得到 MVVM 模式的結構圖:


原始碼解析:

    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 的轉變。