MVVM 簡單理解

MVVM

MVC 雖然一直是蘋果建議的一種設計模式,但是 View 與 Controller 的耦合度過高矢洲,而 Controller 往往會變得越來越臃腫弓候,因此常被戲稱為 Massive View Controller(重量級視圖控制器)。
于是 MVVM (Model-View-ViewModel)應運而生 玻淑。
既然View 與 Controller 的耦合度總是過高育拨,那么不如就將它們正式連接起來亚皂,并將表示邏輯(presentation logic)抽離出來形成 ViewModel吠式。其本質上是優(yōu)化后的 MVC 架構茁彭。


so , talk is cheap show me the code

這是一個簡單的 PersonModel

@interface PersonModel : NSObject

- (instancetype)initwithSalutation:(NSString *)salutation
                         firstName:(NSString *)firstName
                          lastName:(NSString *)lastName
                         birthdate:(NSDate *)birthdate;

@property (nonatomic, readonly) NSString *salutation;
@property (nonatomic, readonly) NSString *firstName;
@property (nonatomic, readonly) NSString *lastName;
@property (nonatomic, readonly) NSDate   *birthdate;

@end

對應的 PersonalViewModel

@interface PersonalViewModel : NSObject

- (instancetype)initWithPerson:(PersonModel *)person;

@property (nonatomic, readonly) PersonModel *person;
@property (nonatomic, readonly) NSString    *nameText;
@property (nonatomic, readonly) NSString    *birthdateText;

@end

內部實現(xiàn)总寒,將原本在 controller 中的工作抽離出來

@implementation PersonalViewModel

- (instancetype)initWithPerson:(PersonModel *)person {
    self = [super init];
    if (!self) return nil;
    
    _person = person;
    if (person.salutation.length > 0) {
        _nameText = [NSString stringWithFormat:@"%@ %@ %@",
                     self.person.salutation,
                     self.person.firstName,
                     self.person.lastName];
    } else {
        _nameText = [NSString stringWithFormat:@"%@ %@",
                     self.person.firstName,
                     self.person.lastName];
    }
    
    NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
    [dateFormatter setDateFormat:@"EEEE MMMM d, yyyy"];
    _birthdateText = [dateFormatter stringFromDate:person.birthdate];
    
    return self;
}

現(xiàn)在 controller 中就變得十分精簡了

    // 變得非常輕量的賦值
    self.nameLable.text = self.viewModel.nameText;
    self.birthdateLabel.text = self.viewModel.birthdateText;

demo 地址

MVVM 總結

通過學習感覺 MVVM 并不是一種新奇的設計模式,它更像是 MVC 的一種完善理肺,核心思想在于抽離復雜的業(yè)務邏輯產生 viewModel 層摄闸,降低耦合度。而使 MVVM 實現(xiàn)響應式編程妹萨,變得更加好用年枕,可以引入 ReactiveCocoa 的 配合。

參考資料:

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末画切,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子囱怕,更是在濱河造成了極大的恐慌,老刑警劉巖毫别,帶你破解...
    沈念sama閱讀 212,222評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件娃弓,死亡現(xiàn)場離奇詭異,居然都是意外死亡岛宦,警方通過查閱死者的電腦和手機台丛,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,455評論 3 385
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人挽霉,你說我怎么就攤上這事防嗡。” “怎么了侠坎?”我有些...
    開封第一講書人閱讀 157,720評論 0 348
  • 文/不壞的土叔 我叫張陵蚁趁,是天一觀的道長。 經常有香客問我实胸,道長他嫡,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,568評論 1 284
  • 正文 為了忘掉前任庐完,我火速辦了婚禮钢属,結果婚禮上,老公的妹妹穿的比我還像新娘门躯。我一直安慰自己淆党,他們只是感情好,可當我...
    茶點故事閱讀 65,696評論 6 386
  • 文/花漫 我一把揭開白布讶凉。 她就那樣靜靜地躺著染乌,像睡著了一般。 火紅的嫁衣襯著肌膚如雪缀遍。 梳的紋絲不亂的頭發(fā)上慕匠,一...
    開封第一講書人閱讀 49,879評論 1 290
  • 那天,我揣著相機與錄音域醇,去河邊找鬼台谊。 笑死,一個胖子當著我的面吹牛譬挚,可吹牛的內容都是我干的锅铅。 我是一名探鬼主播,決...
    沈念sama閱讀 39,028評論 3 409
  • 文/蒼蘭香墨 我猛地睜開眼减宣,長吁一口氣:“原來是場噩夢啊……” “哼盐须!你這毒婦竟也來了?” 一聲冷哼從身側響起漆腌,我...
    開封第一講書人閱讀 37,773評論 0 268
  • 序言:老撾萬榮一對情侶失蹤贼邓,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后闷尿,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體塑径,經...
    沈念sama閱讀 44,220評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,550評論 2 327
  • 正文 我和宋清朗相戀三年填具,在試婚紗的時候發(fā)現(xiàn)自己被綠了统舀。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,697評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖誉简,靈堂內的尸體忽然破棺而出碉就,到底是詐尸還是另有隱情,我是刑警寧澤闷串,帶...
    沈念sama閱讀 34,360評論 4 332
  • 正文 年R本政府宣布瓮钥,位于F島的核電站,受9級特大地震影響窿克,放射性物質發(fā)生泄漏骏庸。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 40,002評論 3 315
  • 文/蒙蒙 一年叮、第九天 我趴在偏房一處隱蔽的房頂上張望具被。 院中可真熱鬧,春花似錦只损、人聲如沸一姿。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,782評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽叮叹。三九已至,卻和暖如春爆存,著一層夾襖步出監(jiān)牢的瞬間蛉顽,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,010評論 1 266
  • 我被黑心中介騙來泰國打工先较, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留携冤,地道東北人。 一個月前我還...
    沈念sama閱讀 46,433評論 2 360
  • 正文 我出身青樓闲勺,卻偏偏與公主長得像曾棕,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子菜循,可洞房花燭夜當晚...
    茶點故事閱讀 43,587評論 2 350

推薦閱讀更多精彩內容