序言
年年歲歲花相似舰始,歲歲年年人不同。
很久很久以前……
MVC模式以低耦合性蛮寂、高重用性蔽午、可維護性等優(yōu)點,使得原本復(fù)雜的代碼與界面的交互變得簡單酬蹋、清晰及老、明了抽莱。開發(fā)者可以把更多的精力放在前端界面的設(shè)計上,而不用絞盡腦汁去思考究竟應(yīng)該如何使界面得到同步骄恶。既減輕了設(shè)計壓力食铐,又能極大提高用戶體驗感。
接下來小編來淺談一下這些架構(gòu)模式僧鲁,同時小編也歡迎大家加入小編的iOS交流群551346706虐呻,群里會提供架構(gòu)的資料,書籍歡迎大家入駐寞秃!
然而隨著時間的推移以及技術(shù)的發(fā)展斟叼,傳統(tǒng)的MVC模式已經(jīng)不適合當下的iOS開發(fā)了。先讓我們來復(fù)習一下iOS中的MVC模式吧春寿!
在 iOS 開發(fā)中朗涩,MVC(Model View Controller)是構(gòu)建iOS App的標準模式。在MVC下绑改,所有的對象被歸類為一個Model谢床,一個View,和一個Controller厘线。Model持有數(shù)據(jù)识腿,View顯示與用戶交互的界面,而ViewController調(diào)解Model和View之間的交互造壮。
現(xiàn)在渡讼,MVC 依然是目前主流客戶端編程框架。然而费薄,在MVC模式中硝全,厚重的Controller、無以立足的網(wǎng)絡(luò)邏輯和較差的可測試性已經(jīng)成為該模式無可避免的問題了
厚重的Controller
由于大量的代碼被放進view controller楞抡,導(dǎo)致他們變的相當臃腫伟众。網(wǎng)絡(luò)數(shù)據(jù)的請求及后續(xù)處理,本地數(shù)據(jù)庫操作召廷,以及一些帶有工具性質(zhì)輔助方法都加大了MassiveViewController的產(chǎn)生凳厢。
遺失的網(wǎng)絡(luò)邏輯
蘋果使用的MVC的定義上說,所有的對象都可以被歸類為一個model,一個view或是一個controller竞慢。那么要把網(wǎng)絡(luò)的代碼放在哪里呢先紫?
顯然,不應(yīng)該把網(wǎng)絡(luò)請求放在view中筹煮。若把它放在model對象里遮精,網(wǎng)絡(luò)調(diào)用應(yīng)該使用異步,可是這樣的話如果一個網(wǎng)絡(luò)請求比它持有的model生命周期更長,事情就會變得復(fù)雜本冲。若是放在contoller里面准脂,也會加劇厚重controller的問題。
較差的可測試性
由于View Controller混合了視圖處理邏輯和業(yè)務(wù)邏輯檬洞,分離這些成分的單元測試成了一個艱巨的任務(wù)狸膏。
為了避免和解決上述問題的產(chǎn)生,于是就從MVC引申出來一種維護性較強添怔、耦合性低的新的架構(gòu)MVVM(Model View View-Mode)湾戳,MVVM正式規(guī)范了視圖和控制器緊耦合的性質(zhì),并引入新的組件广料。MVVM主要目的是為了分離視圖(View)和模型(Model)砾脑。
MVVM是Model-View-ViewModel 的簡寫,最早于2005年被微軟的WPF 和 Silverlight的架構(gòu)師John Gossman提出艾杏。
Model:和MVC中的model保持一致拦止,用于處理數(shù)據(jù)邏輯
View:由 MVC 中的view和 controller 組成,負責 UI 的展示糜颠,綁定 viewModel中的屬性,觸發(fā) viewModel 中的命令以及呈現(xiàn)由viewModel提供的數(shù)據(jù)萧求。
View-Model:它的職責之一就是作為一個表現(xiàn)視圖顯示自身所需數(shù)據(jù)的靜態(tài)模型其兴,它是從 MVC 的 controller 中抽取出來的展示邏輯,負責從 model中獲取 view 所需的數(shù)據(jù)夸政,轉(zhuǎn)換成 view可以展示的數(shù)據(jù)元旬,并暴露公開的屬性和命令供 view 進行綁定。
在MVVM實現(xiàn)中守问,利用 RAC來優(yōu)雅的實現(xiàn)view 和 viewModel 兩者之間的數(shù)據(jù)綁定(同步)匀归。
MVVM優(yōu)點
1. 低耦合。視圖(View)可以獨立于Model變化和修改耗帕,一個ViewModel可以綁定到不同的"View"上穆端,當View變化的時候Model可以不變,當Model變化的時候View也可以不變仿便。
2. 可重用性体啰。你可以把一些視圖邏輯放在一個ViewModel里面,讓很多view重用這段視圖邏輯嗽仪。
3. 獨立開發(fā)荒勇。開發(fā)人員可以專注于業(yè)務(wù)邏輯和數(shù)據(jù)的開發(fā)(ViewModel),設(shè)計人員可以專注于頁面設(shè)計闻坚,使用Expression Blend可以很容易設(shè)計界面并生成xml代碼沽翔。
4. 可測試。界面素來是比較難于測試的窿凤,而現(xiàn)在測試可以針對ViewModel來寫仅偎。
MVP是由 MVC演變而來的跨蟹,它的Presenter根本不用關(guān)心ViewController的生命周期,所以在 Presenter里面幾乎沒有涉及到 UI 的代碼哨颂,我們所有的 UI 處理全部放到了UIViewController里面喷市,這樣的話很符合設(shè)計模式中的單一職責。
在MVP中威恼,View和Model之間是不存在引用和依賴的品姓。
下面分享一個MVP架構(gòu)模式的簡單案例
新建下面的類
在MVPContoller中對三個角色進行關(guān)聯(lián)。
創(chuàng)建屬性
controller類需要關(guān)聯(lián)三個角色箫措,因此需要在該類中創(chuàng)建三個角色的屬性腹备。
對三個角色進行初始化設(shè)置
分別創(chuàng)建三個角色,MVPView要添加到Controller上顯示斤蔓。這個案例就是為了將Model的內(nèi)容顯示到view中植酥。所以這里提前給model設(shè)置好內(nèi)容。調(diào)用presenter的printTask方法將兩者關(guān)聯(lián)起來弦牡。
model中存儲需要的數(shù)據(jù)友驮,定義內(nèi)容屬性
此處跟mvc不同之處就是給view傳遞的是一個字符串而不是一個model。因為view與model在mvp架構(gòu)是無關(guān)聯(lián)的驾锰。
在MVPView.h中創(chuàng)建展示view的方法體
在MVPView.m文件中添加按鈕
初始化按鈕卸留,讓model的內(nèi)容顯示在label上。
presenter.h創(chuàng)建一個方法
這個是業(yè)務(wù)邏輯的入口椭豫。
在MVP模式中耻瑟,所有的耦合都存在與Presenter之中,所以Presenter需要有View和Model的存在赏酥。
將兩者通過Presenter聯(lián)系起來
Prensenter的作用就是調(diào)用view并把model的內(nèi)容傳遞給它喳整。
?到程序入口處調(diào)用MVPController
如此一來,一個簡單的MVP案例搭建完畢裸扶。
面試題
1框都、在MVC模式中,如何解決controller層的臃腫問題姓言?
將網(wǎng)絡(luò)請求抽象到單獨的類中
將界面的拼裝抽象到專門的類中
構(gòu)造 ViewModel?
這樣抽象之后瞬项,View 只接受 ViewModel,而 Controller 只需要傳遞 ViewModel 這么一行代碼何荚。而另外構(gòu)造 ViewModel 的過程囱淋,我們就可以移動到另外的類中了
專門構(gòu)造存儲類
2、MVC 和 MVVM 的區(qū)別
MVVM是對胖模型進行的拆分餐塘,其本質(zhì)是給控制器減負妥衣,將一些弱業(yè)務(wù)邏輯放到VM中處理
MVC是一切設(shè)計的基礎(chǔ),所有新的設(shè)計模式都是基于MVC進行的改進。
參考鏈接:
https://juejin.im/post/59de301cf265da4310475f2c
http://www.reibang.com/p/db8400e1d40e
http://www.reibang.com/p/79591e226d8c
最后
小編在這也推薦一下自己QQ群:551346706税手,學習氛圍還行蜂筹,共同學習探討,三人行必有我?guī)熉梗黄馂樽约焊玫?018加油