iOS 简单的MVVM框架
说到iOS的框架,可能很多人都在使用MVC,Model-View-Controller,这种模式下对于业务的处理就会全部集中到控制器里面去处理,在稍微复杂的页面中,Controller会变得非常的臃肿,难以测试,当然对于后期的维护来说也是一种灾难。MVVM是一种Model-View-ViewModel的模式,是基于MVC的一种框架,因此它是兼容MVC的。同时,它把对业务的处理提取出来,放到了ViewModel中来处理,因此,控制器不用管这些复杂的逻辑处理,我们只要把处理结果给Controller就可以了。
比如说,我们要从网络接口请求数据,在MVC里面,我们要在Controller里面调用网络请求类,返回数据,然后转模型,在展示数据。而在MVVM中,我们把这件事件交给ViewModel来做,只需要把序列化的数据返回给Controller,而Controller根本就不用管数据是怎么请求的,怎么序列化的,这些中间过程Controller都不用管,这样就简化Controller的工作量,模块化了功能,测试起来更加的简单和准确。 当然,MVVM也有自身的缺陷,就是会增加很多的类,尤其是对于那些简单的逻辑处理,这样封装的话反而会显得比较的拖沓。所以对于MVVM框架的使用,还是要看具体的情况来判断。
比如说我们在主页要显示一个列表,要请求数据,我只用实例化一个ViewModel,然后调用它的方法就可以了
- (void)getDataFormNetwork {
// 从网络加载数据
JTMainViewModel *mainViewModel = [[JTMainViewModel alloc] init];
mainViewModel.URL = @"http://***************";
mainViewModel.parameters = nil;
[SVProgressHUD showWithStatus:@"加载中..."];
[mainViewModel requestDataSourceWithSuccess:^(id _Nullable responseObject) {
[SVProgressHUD dismiss];
NSArray *list = (NSArray *)responseObject;
self.dataSource = list;
[self.tableView reloadData];
// 保存到数据库
[self saveToDatabase:list];
} fail:^(NSError * _Nullable error) {
[SVProgressHUD dismiss];
JTLOG(@"error = %@", error);
[self getDataFormDatabase];
} noNetwork:^(BOOL status) {
if (!status) {
[SVProgressHUD showErrorWithStatus:@"网络错误"];
[self getDataFormDatabase];
}
}];
}
网络数据加载失败或者没有联网时,直接调用它对应的方法,拿到数据
// 从数据库加载数据
- (void)getDataFormDatabase {
JTMainViewModel *mainViewModel = [[JTMainViewModel alloc] init];
[mainViewModel getDatabaseWithName:@"t_main" keyword:@"*" condition:@"" complection:^(id _Nullable responesObject, NSError * _Nullable error) {
if (!error) {
NSArray *array = (NSArray *)responesObject;
if (array.count > 0) {
self.dataSource = array;
[self.tableView reloadData];
} else {
JTLOG(@"数据库没有数据");
}
}
else {
JTLOG(@"查询失败");
}
}];
}
而控制器要做的事情就十分的简单了,只需要刷新界面,展示数据。
总结,MVVM框架是基于MVC的,所以对MVC是兼容的,理解起来也很容易。它大大的减少了控制器的工作量,模块化了功能,使我们的Controller看起来十分简洁而高效。
最后附上我Demo的地址:JTConstructForIOS
~end