iOS MVVM設計模式

前言:html

MVC 模式 是iOS業內人士耳熟能詳的,後來逐漸有人提出了MVVM的設計模式,這篇文章的目的是在熟知MVC模式的基礎上進一步認知什麼是MVVM模式,而且在工做中MVVM思想怎麼能對咱們有助力做用。
 
一 .MVC:(Model View Controller)  是構建iOS App的標準模式。大多數開發者也必定在平常的開發中把MVC思想運用的淋漓盡致。

1.基本目的       ios

 將視圖和數據分離開來,下降藕荷度編程

2.基本幾個要點 

 (1)Model        :  (數據模型,數據)持有並負責管理數據:封裝,存儲,處理數據運算等設計模式

 (2)View         :    (視圖,顯示) 顯示UI呈現給用戶,對用戶的target action 行爲 有響應緩存

 (3)Controller :(控制器,管理中心)調度程序工做,調解Model和View之間的交互 ,所有的表示邏輯、業務邏輯都在此 eg網絡請求、事件響應方法網絡

 
3.工做原理: (參考1)

 1)Model 和 View 永遠不能相互通訊,只能經過 Controller 傳遞。架構

 2)Controller 能夠直接與 Model 對話(讀寫調用 Model),Model 經過 Notification 和 KVO 機制與 Controller 間接通訊。函數

 3)Controller 能夠直接與 View 對話,經過 outlet,直接操做 View,outlet 直接對應到 View 中的控件,View 經過 action 向 Controller 報告事件的發生(如用戶 Touch   我了)。Controller 是 View 的直接數據源(數據極可能是 Controller 從 Model 中取得並通過加工了)。Controller 是 View 的代理(delegate),以同步 View 與 Controller。單元測試

4.優勢學習

(1)實現了基本目的:將視圖和數據分離開來,下降藕荷度

  (2)   方便debug調試問題出處是Controller仍是View仍是Model

5. 缺點

(1)隨着項目的不斷迭代開發,Controller 承擔業務量加大,負擔變重。所以網上說起MVVM好處時候難免都diss一下MVC是「Massive View Controller(重量級視圖控制器)」

(2) 較差的可測試性

(3) 遺失的網絡邏輯 //太重的Controller 被堆砌,很難從堆砌的網絡邏輯中查找對應哪個具體UI展現的

6.目前,咱們作的儘量給Controller 減負的方式

(1)遵循基本OC編碼規則,明確函數分組和協議實現中使用#pragma mark -來分類方法。好處來講,代碼結構清晰。不論厚重與否,咱們都遵循統一編碼規則,從review,迭代的角度,都是相對有利的

  (2) 使用類別category,來管理控制器中的業務,一個業務一個同級別類別category。 例如首頁元素:

  •  yiji和起居板塊
  •  健康檔案計劃
  •  調理方案
  •  症狀
  • 文章list

       這些豐富的數據源來一個或者多個接口,UI展現出來有其特有的位置,因而選擇使用類別category的方式來處理。

       注意:使用類別只能離散化代碼,邏輯層面更優秀一些,但不能真正減輕ViewController的負擔。絕對依賴,仍是有問題。進一步優化仍是值得深挖挖

(3)分離數據源:實現 UITableViewDataSource 代理 協議相關的代碼封裝成一個類。這個我以前寫過一個博客 參考連接2。

       注意:這種方法最好是團隊合做在開發上有交集,要絕對你們都知曉你這麼作,並能認同這種優化方式,不然一個後果是,別人讀不懂你的代碼,同事又寫了一遍。。。反而這種分離數據源的方法是一種過渡設計了

(4)使用一些優秀第三方減小代碼量

       eg. Masonry:在純代碼手動代碼設置視圖的約束時,優秀得無可挑剔

           YYKit系列:真是業內大牛利用本身學習心得開源出來的,很是牛逼,閱讀一遍源碼,本身再進行開發時候都下筆若有神的感受。

                          其中YYModel真是比本身寫的那個反射好多了,足夠面向對象,足夠優秀,忽然在大神面前感受本身就是渣渣。繼續努力,保持對學習進步的熱忱之心

(5)尊重面相對象,該封裝的方法,模塊都進行封裝。

       eg.好比AFNetWorking ,作好封裝。把相近業務網絡請求部分放進一個類別裏面,在控制器中直接調用咱們本身的封裝便可

         

二.MVVM: (Model View View-Mode) 是MVC的變種衍生出的一種模式一種能夠很好地解決Massive View Controller問題的辦法就是將 Controller 中的展現邏輯抽取出來,放置到一個專門的地方,而這個地方就是  viewModel
 
1.基本目的    :解決重MVC問題,將Controller中的展現邏輯抽取出來 ( 其實目的都是分離Model與View 更好的解耦合
 
2.基本幾個要點 

 (1)Model                     :  數據層    和MVC中model同樣

 (2)ViewController/View:  展現層    它包括了一些數據綁定,事件,和行爲 和 UI展現給用戶 (ViewController只作了部分膠水做用,View仍是純展現,觸發事件響應給)

 (3)ViewModel             :數據模型  封裝業務邏輯,業務網絡處理,封裝數據緩存,即把MVC中 控制器中的以上三部分等放到ViewModel裏面

  3.工做原理圖:(參考連接4)
    
   
     
     核心ViewModel設計
 
   (1)與View成對設計,負責關聯Model和處理UI邏輯,是界面的非展示部分。
          把原MVC中控制器裏展現邏輯提取出來。參考圖中,主要是封裝業務邏輯,業務網絡處理,封裝數據緩存。 
  
4.優勢
(1)相對MVC 進一步實現了 UI與邏輯的分離 解耦合
(2)可測試性:單元測試方便,基本集中於測試ViewModel
(3)配合ReactiveCocoa療效好。裏面豐富運用了Hook思想響應式編程思想。。。監聽數據變化更新UI
5.缺點
(1)簡單場景不適合MVVM模式,過猶不及反而顯得太重。
       每次進行架構或者功能設計時候都應該要仔細思考,選擇的設計模式是否合理有效,是否可以可持續發展
(2)ViewModel自己也會愈來愈沉重 ,項目業務邏輯,交互邏輯增長。
        ViewModel可複用性不太可觀,高度複用耦合性會加大。因此會不斷建立各中ViewModel,容易出現類型爆炸,提升維護成本。
  (3)  對於過大的項目,數據綁定和數據轉化須要花費更多的內存。
(4)數據綁定機制致使問題轉移難以調試bug,eg由於表象是UI賦值顯示問題,可是還多是模型轉化,根本問題被轉移了。。。
 
 以上
 
 
 
參考
1.https://www.cnblogs.com/QianChia/p/5771082.html
 
2. http://www.cnblogs.com/someonelikeyou/p/6522150.html 
 
3.  http://www.cocoachina.com/ios/20150122/10987.html 架構模式
4. http://www.cocoachina.com/ios/20170612/19500.html 
5. https://www.jianshu.com/p/a21dec9ab84f
相關文章
相關標籤/搜索