MVC:M(模型)+V(視圖)+C(控制器)
MVVM:M(模型)+V(視圖+控制器)+VM:(視圖模型)
1.MVC架構(gòu)模式
這張圖片是斯坦福大學(xué)公開課上最經(jīng)典和最規(guī)范的MVC標(biāo)準(zhǔn).
比如我們要用MVC架構(gòu)模式實(shí)現(xiàn)這個(gè)頁面
a.模型對(duì)象(M)
是封裝了應(yīng)用程序的數(shù)據(jù),簡單理解就是一個(gè)頁面中要展示每一個(gè)商品的價(jià)格,圖片,描述,銷量.價(jià)格模型對(duì)象中就有相應(yīng)的價(jià)格,圖片,描述,銷量,價(jià)格屬性.
b.視圖對(duì)象(V)
是繪制出來的用戶可以看見及操作的視圖,比如每一個(gè)商品存在cell中,cell又有
說商品的價(jià)格要用Laber顯示,圖片要用UIImageView顯示等
c.控制器(C)
連接視圖類和模型類疆导,任務(wù)是把每一個(gè)商品信息都顯示在屏幕上。
那么他們之間又是如何通信的呢.
1.模型和控制器之間的通信方式
a.廣播通知,控制器注冊(cè)監(jiān)聽模型數(shù)據(jù)變化的通知赌莺,在數(shù)據(jù)變化時(shí)骇吭,模型發(fā)送廣播通知目代,控制器收到通知進(jìn)行下一步處理遮婶。
b.KVO(key-value-observing):就是用模型座位控制器的一個(gè)屬性袱衷,模型中的值有所改變,下次控制器在使用模型數(shù)據(jù)時(shí)宦搬,會(huì)取到最新的數(shù)據(jù)汉嗽。
2.視圖與控制器通信方式
a.目標(biāo)動(dòng)作機(jī)制(target-action)陈惰,簡單來講就是用戶與視圖交互溶握,通過交互事件觸發(fā)控制器的方法匾鸥。比如:按鈕的點(diǎn)擊奴愉,下拉刷新等等暑始。
b.委托代理(delegate)吱雏,視圖講自己無法決定的是委托給控制器實(shí)現(xiàn),通過自己的代理方法完成自己的需要龄捡,比如商品的點(diǎn)擊對(duì)應(yīng)進(jìn)入商品的詳情頁面慷暂。
c.數(shù)據(jù)源機(jī)制,視圖告訴控制器想要做什么行瑞,比如每個(gè)商品的顯示,商品數(shù)據(jù)存在model中突照,控制器訪問model拿到數(shù)據(jù)再告訴視圖怎么顯示氧吐。
總結(jié):MVC看似挺好,但是問題來了座慰,MVC使用起來內(nèi)部邏輯可以說是相當(dāng)復(fù)雜豁翎,在設(shè)計(jì)的時(shí)候需要很好的考慮,能夠完全自如的適用MVC也算是有一定的水準(zhǔn)了邦尊。建議:項(xiàng)目相對(duì)不是很大的就不要用了优烧。
2.MVVM架構(gòu)模式
從上面這張圖MVVM比MVC多出來一個(gè)VM的結(jié)合體,這個(gè)多出來的結(jié)合體對(duì)視圖控制器以任何形式直接起作用或直接通告其變化,呈現(xiàn)由 view-model 提供的數(shù)據(jù)畦娄。當(dāng)展示一個(gè)新的視圖控制器時(shí), 或很小的視圖被 view-model 表現(xiàn)時(shí), 你應(yīng)要求當(dāng)前的 view-model 為你創(chuàng)建一個(gè)子 view-model.
以上面那個(gè)商品列表頁面來說,我們需要建立一個(gè)productViewModel為控制器提供商品的價(jià)格,圖片,描述,銷量,價(jià)格數(shù)據(jù).
總結(jié):在 iOS 上使用 MVVM 的動(dòng)機(jī),就是讓它能減少 View Controller 的復(fù)雜性并使得表示邏輯更易于測試