MVVM架構的一次實踐,重寫iOS頭條客戶端

ChassidyKAF 9年前發布 | 28K 次閱讀 MVVM模式 IOS iOS開發 移動開發

前言:

一個iOS頭條APP,使用MVVM架構實現,代碼中有注釋,封裝了AFN網絡請求,解媾代碼,使用起來非常方便。用最經典的TableView展示,后續不斷更新,喜歡就star或fork一下,有問題或者建議意見就issues!

本例基于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 進行較大的改動。
 

通過前面的示例,我們對第一點已經有了一定的感觸;至于第三點,可能對于一個復雜的大型應用來說,才會比較明顯。

來自: http://ios.jobbole.com/84930/

 本文由用戶 ChassidyKAF 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!