美文网首页
iOS 简单的MVVM框架

iOS 简单的MVVM框架

作者: Kenter_Huang | 来源:发表于2016-11-24 11:48 被阅读117次

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

    相关文章

      网友评论

          本文标题:iOS 简单的MVVM框架

          本文链接:https://www.haomeiwen.com/subject/cjevpttx.html