MVC
傳統(tǒng)的MVC割疾,Cocoa MVC嚎卫,以及大多數(shù)iOS開發(fā)使用的MVC,這三者并不相同宏榕。
MVC歷史悠久拓诸,在不同平臺(tái)有各自的實(shí)現(xiàn)方式。其目的是實(shí)現(xiàn)并行開發(fā)和代碼復(fù)用麻昼。
蘋果也設(shè)計(jì)自己的MVC恰响,其特點(diǎn)是:M和V相互隔離,通過C連接涌献。
但實(shí)際的使用并非如此。通常ViewController同時(shí)扮演了C和部分V的角色首有,顯得非常龐大燕垃。其中包含了各種邏輯,也不利于測(cè)試井联。
M和V經(jīng)常會(huì)直接通信卜壕,產(chǎn)生了耦合。例如Cell類經(jīng)常提供這樣的方法計(jì)算高度:
+ (CGFloat)cellHeightWithModel:(SomeModel *)model;
MVP
MVP中的V在iOS中指的是ViewController和View烙常。MVP將MVC的ViewController進(jìn)行拆分:視圖數(shù)據(jù)邏輯處理部分為P轴捎,ViewController剩余部分與View合并成V鹤盒。V和P之間通過Protocol進(jìn)行通信。
視圖數(shù)據(jù)邏輯:與視圖相關(guān)的數(shù)據(jù)處理侦副。例如將
NSDate
轉(zhuǎn)換成NSString
侦锯。
MVP實(shí)現(xiàn)了各模塊的解藕,具有更好的可測(cè)試性秦驯。但是總體代碼量比MVC大尺碰。
另外,iOS MVC更適用于快速開發(fā)译隘,即代碼規(guī)模較小的項(xiàng)目亲桥。因此將簡(jiǎn)單的MVC的Demo改成MVP,反而會(huì)顯得笨拙固耘。
MVVM
在MVP的基礎(chǔ)上题篷,將P改成與V雙向綁定的VM就變成了MVVM。
綁定是一種響應(yīng)式的通信方式厅目。當(dāng)被綁定對(duì)象某個(gè)值的變化時(shí)番枚,綁定對(duì)象會(huì)自動(dòng)感知,無需被綁定對(duì)象主動(dòng)通知綁定對(duì)象璧瞬』П瑁可以使用KVO和RAC實(shí)現(xiàn)。例如在Label中顯示倒計(jì)時(shí)嗤锉,是V綁定了包含定時(shí)器的VM渔欢。
雙向綁定在MVVM中指的是V和VM之間相互綁定。例如TextField的text長(zhǎng)度達(dá)到閾值瘟忱,另一個(gè)Button改變背景顏色奥额。這個(gè)過程中首先VM感知V中TextField的text屬性長(zhǎng)度變化,V感知VM中對(duì)應(yīng)的狀態(tài)屬性访诱。一旦V中TextField的text屬性長(zhǎng)度超出VM中的閾值垫挨,VM中的狀態(tài)屬性改變,觸發(fā)V中Button的背景色發(fā)生改變触菜。
選擇
- 越復(fù)雜的框架耦合度越小九榔,但是開發(fā)速度越慢,反之亦然涡相。所以要根據(jù)具體項(xiàng)目需求哲泊,在不同階段決定框架。
- 如果模式之間存在兼容性催蝗,可選擇混合開發(fā)切威。