MVC
1.MVC 介紹
MVC 模式的意思就是將軟件分為三個部分:
- 視圖(view):用戶界面
- 控制器(Controller):業(yè)務(wù)邏輯
- 模型(Model):數(shù)據(jù)保存
2.MVC 各個模塊之間的通訊說明
MVC 各個部分之間的通訊:
- Model :用來保存數(shù)據(jù)
- view : 用來顯示Model的數(shù)據(jù)
- Controller :用來調(diào)節(jié)模型和視圖之間的交互。(完成業(yè)務(wù)邏輯的處理)
mvc 中所有的通信都是單向的蘸朋。
兩幅代表性的圖:
我傾向于這個圖吐根!
MVP
MVP 模式將 Controller 改名為 Presenter, 同時改變通信的方向贞奋。
- 各個部分之間的通訊都是雙向的勾缭。
- View 和 Mode 不發(fā)生聯(lián)系,都是通過 Presenter 傳遞煞躬。
- View 非常的薄, 不部署任何的業(yè)務(wù)邏輯妓局,被稱為“ 被動視圖”(Passive View),即沒有任何的主動性融虽,而Presenter 非常厚茴迁, 所有邏輯都部署在哪里椿争。
MVVM
mvvm 介紹
MVVM 模式將 Presenter 改名為ViewModel, 基本上與 MVP 模式完全一致边苹。
唯一的區(qū)別就是沪悲,它采用雙向綁定(data-binding):View 的變動,自動反應(yīng)到 ViewModel 帮坚,反之亦然局嘁。
在iOS 開發(fā)中為什么要使用 MVVM
在iOS 應(yīng)用中日益增長的重量級視圖控制器的問題:在 MVC 應(yīng)用里,許多邏輯被放在ViewController 里剩岳。它們中的一些確實屬于ViewController ,但更多的是所謂的“表示邏輯”(presentation logic)腰池;為了不讓控制器日益增大示弓,便于測試管理。便出現(xiàn)了MVVM.
MVVM: 其實是 MVC 的增強版本忱嘹,將表示邏輯從Controller 中移出础米,放到一個新的對象里,即ViewModel
MVVM 學(xué)習(xí)的博客推薦:
1事扭、淺談iOS中MVVM的架構(gòu)設(shè)計與團(tuán)隊協(xié)作 -->包含示例代碼
2、ReactiveCocoa 和 MVVM 入門
一句話就是剝離或輕量化 Controller 中關(guān)于 View 和 Model 的部分涵亏。
Model-View-ViewModel 可以:
? MVVM 可以兼容你當(dāng)下使用的 MVC 架構(gòu)宰睡。
? MVVM 增加你的應(yīng)用的可測試性。
? MVVM 配合一個綁定機制效果最好气筋。
并沒有對我們的MVC架構(gòu)做太多改變拆内。還是同樣的代碼,只不過移動了位置宠默。它與MVC兼容麸恍,帶來更輕量的ViewControllers。
Model 是不可變的搀矫,所以我們可以只在初始化的時候指定我們 View Model 的屬性抹沪。對于可變 Model,我們還需要使用一些綁定機制瓤球,這樣 View Model 就能在背后的 Model 改變時更新自身的屬性融欧。此外,一旦 View Model 上的 Model 發(fā)生改變卦羡,那 View 的屬性也需要更新噪馏。Model 的改變應(yīng)該級聯(lián)向下通過 View Model 進(jìn)入 View。
更輕量的 View Controllers
? 把 Data Source 和其他 Protocols 分離出來
? 將 Domain Logic 移到 Model 中
? 創(chuàng)建 Store 類
? 把網(wǎng)絡(luò)請求邏輯移到 Model 層
? 把 View 代碼移到 View 層
我們已經(jīng)看到一些用來創(chuàng)建更小巧的 view controllers 的技術(shù)虹茶。我們并不是想把這些技術(shù)應(yīng)用到每一個可能的角落逝薪,只是我們有一個目標(biāo):寫可維護(hù)的代碼。知道這些模式后蝴罪,我們就更有可能把那些笨重的 view controllers 變得更整潔。
MVVM = Model + View + ViewModel
看上去和MVC差不多步清,就是把ViewController替換成了ViewModel要门。如果是這樣的話,MVVM壓根就沒有存在的必要了廓啊。所以并不是進(jìn)行了簡單的替換欢搜。MVVM由3部分組成:Model , View 谴轮, ViewModel炒瘟。
? Model: 作為數(shù)據(jù)的容器
? View: 負(fù)責(zé)界面的展示以及用戶交互的處理
? ViewModel: 負(fù)責(zé)業(yè)務(wù)邏輯處理
iOS中的MVVM
然并卵iOS中我們沒有辦法繞過UIViewController。諸如UITabController第步, UINavigationController是非常非常常用的疮装。沒有這些容器缘琅,我們寫界面時的情景簡直不敢想象。IB與UIViewController的結(jié)合比較緊密廓推。如果你通過IB來畫界面的話刷袍,更離不開UIViewController。那么iOS中的MVVM是什么樣的?
? Model: 作為數(shù)據(jù)的容器
? View: 負(fù)責(zé)界面的展示以及用戶交互的處理
? ViewController: 用代碼創(chuàng)建視圖樊展;膠水代碼呻纹,連接View和ViewModel
? ViewModel: 負(fù)責(zé)業(yè)務(wù)邏輯處理
Model,View专缠,ViewModel的職責(zé)都沒有改變雷酪。iOS的MVVM開發(fā)模式中ViewController只做與視圖有關(guān)的操作,以及連接View與ViewModel的膠水代碼涝婉。也就是說View部分其實是由原本的View+部分ViewController組成太闺。
膠水代碼
iOS中沒有膠水代碼的MVVM是不完整的
膠水代碼都做了哪些事情?
- 將控件的事件傳遞給ViewModel嘁圈,使得ViewModel其有機會處理用戶交互省骂。
- 將ViewModel的內(nèi)容與View進(jìn)行綁定,使得View有機會顯示正確的內(nèi)容最住。
在ReactiveCocoa出來之前钞澳,膠水代碼很難寫的很優(yōu)雅。這也是為什么以前iOS中MVVM并不怎么火的原因涨缚。關(guān)于ReactiveCocoa的學(xué)習(xí)與使用本文不會涉及轧粟。如果有需要可以自行搜索學(xué)習(xí)。它是響應(yīng)式開發(fā)的利器脓魏。
iOS的MVVM開發(fā)模式不能沒有"ReactiveCocoa"
沒有膠水代碼兰吟,你不能將業(yè)務(wù)邏輯從ViewController中抽離。