MVVM與Controller瘦身實踐

  MVC是一個作iOS開發都知道的設計模式,也是Apple官方推薦的設計模式。實際上,Cocoa Touch就是按照MVC來設計的。
  
  這裏,咱們先不講MVC是什麼,咱們先來談談軟件設計的一些原則或者說理念。在開發App的時候,咱們的基本目標有如下幾點:
  
  可靠性 - App的功能可以正常使用
  
  健壯性 - 在用戶非正常使用的時候,app也可以正常反應,不要崩潰
  
  效率性 - 啓動時間,耗電,流量,界面反應速度在用戶容忍的範圍之內
  
  上文三點是表象層的東西,是大多數開發者或者團隊會着重注意的。除了這三點,還有一些目標是工程方面的也是開發者要注意的:
  
  可修改性/可擴展性 - 軟件須要迭代,功能不斷完善
  
  容易理解 - 代碼可以容易理解
  
  可測試性 - 代碼可以方便的編寫單元測試和集成測試
  
  可複用性 - 不用一次又一次造輪子
  
  因而,軟件設計領域有了幾大通用設計原則來幫助咱們實現這些目標:
  
  單一功能原則,最少知識原則,聚合複用原則,接口隔離原則,依賴倒置原則,里氏代換原則,開-閉原則
  
  這裏的每個原則均可以寫單獨的一篇文章,本文篇幅有限,很少講解。
  
  基於這些設計目標和理念,軟件設計領域又有了設計模式。MVC/MVVM都是就是設計模式的一種。
  
  MVC
  
  歷史
  
  二十世紀世紀八十年代,Trygve Reenskaug在訪問Palo Alto(施樂帕克)實驗室的時候,第一次提出了MVC,而且在Smalltalk-76進行了實踐,大名鼎鼎的施樂帕克實驗室有不少劃時代的研發成果:我的電腦,以太網,圖形用戶界面等。
  
  在接下來的一段時間內,MVC不斷的進化,基於MVC又提出了諸如MVP(model–view–presenter),MVVM(model–view–viewmodel)等設計模式。
  
  組件
  
  MVC設計模式按照職責將應用中的對象分紅了三部分:Model,View,Controller。MVC除了將應用劃分紅了三個模塊,還定義了模塊之間的通訊方式。
  
  Model
  
  Model定義了你的應用是什麼(What)。Model一般是純粹的NSObject子類(Swift中能夠是Struct/Class),僅僅用來表示數據模型。
  
  Controller
  
  Controller定義了Model如何顯示給用戶(How),而且View接收到的事件反饋到最後Model的變化。Controller層做爲MVC的樞紐,每每要承擔許多Model與View同步的工做。
  
  View
  
  View是Model的最終呈現,也就是用戶看到的界面。
  
  優勢
  
  MVC設計模式是是一個成熟的設計模式,也是Apple推薦的的設計模式,即便是剛入行的ios開發者也多少了解這個設計模式,因此對於新人來講上手迅速,而且有大量的文檔和範例來供咱們參考。
  
  在MVC模式中,View層是比較容易複用的,對應Cocoa中的UIView及其子類。因此,github的iOS開源項目中,View層也是最多的。
  
  Model層涉及到了應用是什麼,這一層很是獨立,可是每每和具體業務相關,因此很難跨App服用。
  
  既然只有Model-View-Controller三個組件,那麼剩餘的邏輯層代碼就比較清楚了,所有堆積到Controller。
  
  通訊
  
  MVC不只定義了三類組件,還定義了組件之間通訊的方式。
  
  MVC三個組件之間的通訊方式如圖
  
  Controller做爲樞紐,它指向view和Model的線都是綠色的,意味着Controller能夠直接訪問(以引用的方式持有)Model和View。
  
  View指向Controller的是虛線,虛線表示View到Controller的通訊是盲通訊的,緣由也很簡單:View是純粹的展現部分,它不該該知道Controller是什麼,它的工做就是拿到數據渲染出來。
  
  那麼,何爲盲通訊呢?簡單來講當消息的發送者不知道接受者詳細信息的時候,這樣的通訊就是盲通訊。Cocoa Touch爲咱們提供了諸如delegate(dataSource),block,target/action這些盲通訊方式。
  
  Model指向Controller的一樣也是虛線。緣由也差很少,Model層表明的數據層應該與Controller無關。當Model改變的時候,經過KVO或者Notification的方式來通知Controller應當更新View。
  
  這裏有一點要提一下:UIViewController每每用來做爲MVC中的Controller,MVC中的Controller也能夠由其餘類來實現。
  
  問題
  
  經過上文的講解,咱們能夠看到在純粹的MVC設計模式中,Controller不得不承擔大量的工做:
  
  網絡API請求
  
  數據讀寫
  
  日誌統計
  
  數據的處理(JSON<=>Object,數據計算)
  
  對View進行佈局,動畫
  
  處理Controller之間的跳轉(push/modal/custom)
  
  處理View層傳來的事件,返回到Model層
  
  監聽Model層,反饋給View層
  
  因而,大量的代碼堆積在Controller層中,MVC最後成了Massive View Controller(重量級視圖控制器)。
  
  爲了解決這種問題,咱們一般會爲www.jiyuannnn.cn/ Controller瘦身,也就是把C www.yongshiiyule.cn /ontroller中代碼抽出到不一樣的類中,引入MVVM就是爲Controller瘦身的一個很好的實踐。
  
  MVVM
  
  在MVVM設計模式中,組件變成了Model-View-www.huazongyule.com/ ViewModel。
  
  MVVM有兩個規則
  
  View持有ViewModel的引用,反之沒有
  
  ViewModel持有Model的引用,反之沒有
  
  圖中,咱們仍然以實線表示持有,虛線表示盲通訊。
  
  在iOS開發中,UIViewController是一個至關重要的角色,它是一個個界面的容器,負責接收各種系統的事件,可以實現界面專場的各類效果,配合NavigationController等可以輕易的實現各種界面切換。
  
  在實踐中,咱們發現UIViewController和View每每是綁定在一塊兒的,好比UIViewController的一個屬性就是view。在MVVM中,Controller能夠看成一個重量級的View(負責界面切換和處理各種系統事件)。ios

相關文章
相關標籤/搜索