前言:html
1.基本目的 ios
將視圖和數據分離開來,下降藕荷度編程
(1)Model : (數據模型,數據)持有並負責管理數據:封裝,存儲,處理數據運算等設計模式
(2)View : (視圖,顯示) 顯示UI呈現給用戶,對用戶的target action 行爲 有響應緩存
(3)Controller :(控制器,管理中心)調度程序工做,調解Model和View之間的交互 ,所有的表示邏輯、業務邏輯都在此 eg網絡請求、事件響應方法網絡
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。 例如首頁元素:
這些豐富的數據源來一個或者多個接口,UI展現出來有其特有的位置,因而選擇使用類別category的方式來處理。
注意:使用類別只能離散化代碼,邏輯層面更優秀一些,但不能真正減輕ViewController的負擔。絕對依賴,仍是有問題。進一步優化仍是值得深挖挖
(3)分離數據源:實現 UITableViewDataSource 代理 協議相關的代碼封裝成一個類。這個我以前寫過一個博客 參考連接2。
注意:這種方法最好是團隊合做在開發上有交集,要絕對你們都知曉你這麼作,並能認同這種優化方式,不然一個後果是,別人讀不懂你的代碼,同事又寫了一遍。。。反而這種分離數據源的方法是一種過渡設計了
(4)使用一些優秀第三方減小代碼量
eg. Masonry:在純代碼手動
代碼設置視圖的約束時,優秀得無可挑剔
YYKit系列:真是業內大牛利用本身學習心得開源出來的,很是牛逼,閱讀一遍源碼,本身再進行開發時候都下筆若有神的感受。
其中YYModel真是比本身寫的那個反射好多了,足夠面向對象,足夠優秀,忽然在大神面前感受本身就是渣渣。繼續努力,保持對學習進步的熱忱之心
(5)尊重面相對象,該封裝的方法,模塊都進行封裝。
eg.好比AFNetWorking ,作好封裝。把相近業務網絡請求部分放進一個類別裏面,在控制器中直接調用咱們本身的封裝便可
(1)Model : 數據層 和MVC中model同樣
(2)ViewController/View: 展現層 它包括了一些數據綁定,事件,和行爲 和 UI展現給用戶 (ViewController只作了部分膠水做用,View仍是純展現,觸發事件響應給)
(3)ViewModel :數據模型 封裝業務邏輯,業務網絡處理,封裝數據緩存,即把MVC中 控制器中的以上三部分等放到ViewModel裏面