iOS中,我們使用的大部分都是MVC架構(gòu)雖然MVC的層次明確,但是由于功能日益的增加,代碼的維護(hù)氓润,更多的代碼被寫(xiě)在了Controller中,這樣Controller就顯得非常臃腫憋沿。為了給Controller瘦身旺芽,后來(lái)又從MVC衍生出了一種新的架構(gòu)模式MVVM架構(gòu).
MVVM分別指什么
Model-數(shù)據(jù)層
ViewController/View-展示層
ViewModel- 數(shù)據(jù)模型
MVVM與MVC的不同
首先我們簡(jiǎn)化一下MVC的架構(gòu)模式圖:
在這里,Controller需要做太多得事情辐啄,表示邏輯采章、業(yè)務(wù)邏輯壶辜,所以代碼量非常的大悯舟。
而MVVM:
比如我們有一個(gè)需求:一個(gè)頁(yè)面砸民,需要判斷用戶是否手動(dòng)設(shè)置了用戶名岭参。如果設(shè)置了姿染,正常顯示用戶名悬赏;如果沒(méi)有設(shè)置,則顯示“用戶001”這種格式闽颇。(雖然這些本應(yīng)是服務(wù)器端判斷的)
我們看看MVC和MVVM兩種架構(gòu)都是怎么實(shí)現(xiàn)這個(gè)需求的
MVC:
Model類:
#import <Foundation/Foundation.h>
@interface User : NSObject
@property (nonatomic, copy) NSString *userName;
@property (nonatomic, assign) NSInteger userId;
@end
ViewController類:
#import "HomeViewController.h"
#import "User.h"
@interface HomeViewController ()
@property (nonatomic, strong) UILabel *lb_userName;
@property (nonatomic, strong) User *user;
@end
@implementation HomeViewController
- (void)viewDidLoad {
[super viewDidLoad];
if (_user.userName.length > 0) {
_lb_userName.text = _user.userName;
} else {
_lb_userName.text = [NSString stringWithFormat:@"用戶%ld", _user.userId];
}
}
這里我們需要將表示邏輯也放在ViewController中盾戴。
MVVM:
Model類:
#import <Foundation/Foundation.h>
@interface User : NSObject
@property (nonatomic, copy) NSString *userName;
@property (nonatomic, assign) NSInteger userId;
@end
ViewModel類:
聲明:
#import <Foundation/Foundation.h>
#import "User.h"
@interface UserViewModel : NSObject
@property (nonatomic, strong) User *user;
@property (nonatomic, copy) NSString *userName;
- (instancetype)initWithUser:(User *)user;
@end
實(shí)現(xiàn):
#import "UserViewModel.h"
@implementation UserViewModel
- (instancetype)initWithUser:(User *)user {
self = [super init];
if (!self) return nil;
_user = user;
if (user.userName.length > 0) {
_userName = user.userName;
} else {
_userName = [NSString stringWithFormat:@"用戶%ld", _user.userId];
}
return self;
}
@end
Controller類:
#import "HomeViewController.h"
#import "UserViewModel.h"
@interface HomeViewController ()
@property (nonatomic, strong) UILabel *lb_userName;
@property (nonatomic, strong) UserViewModel *userViewModel;
@end
@implementation HomeViewController
- (void)viewDidLoad {
[super viewDidLoad];
_lb_userName.text = _userViewModel.userName;
}
可見(jiàn),Controller中我們不需要再做多余的判斷兵多,那些表示邏輯我們已經(jīng)移植到了ViewModel中尖啡,ViewController明顯輕量了很多。
總結(jié):
MVVM同MVC一樣中鼠,目的都是分離Model與View可婶,但是它更好的將表示邏輯分離出來(lái)沿癞,減輕了Controller的負(fù)擔(dān)援雇;
ViewController中不要引入Model,引入了就難免會(huì)在Controller中對(duì)Model做處理椎扬。并且Controller里面只負(fù)責(zé)界面賦值惫搏,邏輯處理分發(fā)到ViewModel里去,深層次的解耦MVC蚕涤;
本篇文章轉(zhuǎn)載自http://www.cnblogs.com/includeao/p/6425091.html筐赔,說(shuō)明了MVVM的設(shè)計(jì)思路和提供了一個(gè)小小的demo,希望對(duì)于有MVC經(jīng)驗(yàn)的開(kāi)發(fā)者而言揖铜,能針對(duì)MVVM進(jìn)行快速入門茴丰。(PS:對(duì)于復(fù)雜的情況,通常使用RAC進(jìn)行信息傳遞天吓,結(jié)合RAC能夠靈活的進(jìn)行MVVM模式設(shè)計(jì)框架贿肩,網(wǎng)上有一堆資料,后續(xù)有時(shí)間也會(huì)整理一個(gè)入門demo)