MVVM 简单理解
2017-03-31 本文已影响94人
漂泊海上的大土豆
MVVM
MVC 虽然一直是苹果建议的一种设计模式,但是 View 与 Controller 的耦合度过高,而 Controller 往往会变得越来越臃肿,因此常被戏称为 Massive View Controller(重量级视图控制器)。
于是 MVVM (Model-View-ViewModel)应运而生 。
既然View 与 Controller 的耦合度总是过高,那么不如就将它们正式连接起来,并将表示逻辑(presentation logic)抽离出来形成 ViewModel。其本质上是优化后的 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
内部实现,将原本在 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;
}
现在 controller 中就变得十分精简了
// 变得非常轻量的赋值
self.nameLable.text = self.viewModel.nameText;
self.birthdateLabel.text = self.viewModel.birthdateText;
MVVM 总结
通过学习感觉 MVVM 并不是一种新奇的设计模式,它更像是 MVC 的一种完善,核心思想在于抽离复杂的业务逻辑产生 viewModel 层,降低耦合度。而使 MVVM 实现响应式编程,变得更加好用,可以引入 ReactiveCocoa 的 配合。
参考资料:
- Limboy’s HQ ReactiveCocoa与Functional Reactive Programming
- ObjC 中国 - MVVM 介绍
- MVVM With ReactiveCocoa - 简书
- Barbara Oakley: “Learning How to Learn” | Talks at Google - YouTube
- Limboy’s HQ
- iOS 7 Best Practices; A Weather App Case Study: Part 1/2 一个外国小哥写的天气app,方便理解
- 基于ReactiveCocoa和MVVM设计的购物车基本操作实现代码解析 | 乔同X的博客