iOS 简单的MVVM框架

2016-11-24  本文已影响117人  Kenter_Huang

说到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

上一篇下一篇

猜你喜欢

热点阅读