有你在真好 的个人博客
「福利」ios 开发两大框架对比:MVC KO MVVM
阅读:2276 添加日期:2021/3/27 23:25:26 原文链接:https://www.toutiao.com/item/6429839849334768130/

做ios开发已有5个年头,近期对一些app 架构加深理解,如现在比较流行的MVVM ,reactivecocoa,今天谈谈MVC 和 MVVM的区别。

一.关系图:

MVC:Model-数据层,V:展现层,C:控制器层,逻辑关系如下图:

「福利」ios 开发两大框架对比:MVC KO MVVM

MVVM:Model-数据层,ViewController/View-展示层,ViewModel- 数据模型,逻辑关系如下图:

「福利」ios 开发两大框架对比:MVC KO MVVM

二.使用MVVM的好处:

1.多年的开发经验告诉我,在MVC中,Controller需要做太多得事情,表示逻辑、业务逻辑,所以代码量非常的大,而且复用性差。

2.MVVM中的VM部分做单元测试非常方便。

三.简单dome

MVC:

#import "MVCViewController.h"

#import "Person.h"

@interface MVCViewController ()<UITableViewDelegate,UITableViewDataSource>{

UITableView *_mTableView;

}

@property (nonatomic, strong) NSArray *myDataArray;

@end

@implementation MVCViewController

- (void)viewDidLoad {

[super viewDidLoad];

self.title = @"MVC";

[self creatTableView];

[self getData];

}

- (void)didReceiveMemoryWarning {

[super didReceiveMemoryWarning];

// Dispose of any resources that can be recreated.

}

- (void)getData {

// 加载模型数据

NSMutableArray *mArray = [NSMutableArray new];

if (_myDataArray == nil) {

for (int i = 0 ; i< 20; i++) {

NSString *nameStr = [NSString stringWithFormat:@"TOM:%d",i];

Person *p = [Person new];

p.name = nameStr;

[mArray addObject:p];

}

_myDataArray = [mArray copy];

}

}

- (void)creatTableView

{

if (_mTableView == nil) {

UITableView *myTableView = [[UITableView alloc] initWithFrame:CGRectMake(0, 0, self.view.bounds.size.width,

self.view.bounds.size.height)];

[myTableView registerClass:[UITableViewCell class] forCellReuseIdentifier:@"cellId"];

myTableView.delegate = self;

myTableView.dataSource = self;

[self.view addSubview:myTableView];

_mTableView = myTableView;

}

}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{

return [self.myDataArray count];

}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"cellId" forIndexPath:indexPath];

// 从 Modal 数据模型中取出数据更新 View 的内容

Person *p = self.myDataArray[indexPath.row];

cell.textLabel.text = p.name;

return cell;

}

MVVM:

#import "MVVMViewController.h"

#import "MyTableDataSource.h"

#import "PersonViewModel.h"

@interface MVVMViewController (){

UITableView *_mTableView;

MyTableDataSource *_dataSource;

}

@end

@implementation MVVMViewController

- (void)viewDidLoad {

[super viewDidLoad];

[self creatTableView];

PersonViewModel *viewModel = [PersonViewModel new];

[viewModel requestPersonModelData:^(NSArray *personArray) {

_dataSource.personArray = personArray;

[_mTableView reloadData];

}];

// Do any additional setup after loading the view.

}

- (void)didReceiveMemoryWarning {

[super didReceiveMemoryWarning];

// Dispose of any resources that can be recreated.

}

- (void)creatTableView

{

if (_mTableView == nil) {

UITableView *myTableView = [[UITableView alloc] initWithFrame:CGRectMake(0, 0, self.view.bounds.size.width,

self.view.bounds.size.height)];

[myTableView registerClass:[UITableViewCell class] forCellReuseIdentifier:@"cellId"];

_dataSource = [MyTableDataSource new];

myTableView.dataSource = _dataSource;

[self.view addSubview:myTableView];

_mTableView = myTableView;

}

}

是不是瘦很多?具体项目代码看我的gitHub:
https://github.com/kfq0072/MVCAndMVVM.git

ICP备案号:苏ICP备14035786号-1 苏公网安备 32050502001014号