对于MVVM中的ViewModel的使用总结

作者: 码工人生 | 来源:发表于2016-09-03 16:13 被阅读136次

    -.MVVM在什么情况下使用?

       在刚写代码的初期,还处于学徒阶段时,绝大部分用的都是MVC框架,尤其很多的培训机构里面的老师,也是主张使用MVC框架。当一个很复杂的功能集中要在一个Controller中实现时,你就不知不觉的发现我这个Controller的代码已经超过了1000行。当项目迭代几个版本后,你的同事来修改这个Controller的代码时,心中必然有一堆怒火。其实这个时候,你就需要用MVVM了,让ViewModel来分担Controller既多又复杂的那部分内容。

    二.哪些内容需要放在ViewModel中?

        这是一个很值得思考的问题。我的建议是,如果一个Controller非常简单,只是请求完数据,然后赋值给view的空间的话,那么完全没必要使用ViewModel,换句话来说,200行以下的Controller可以实现所有的需求的话,没必要建立ViewModel.有着复杂逻辑,需要封装出很多新的方法,那么这些复杂的逻辑都需要放到ViewModel中去。

    把凡是牵扯需要逻辑的方法,以及从任何入口进去到Controller的数据(eg:上一个类传过来的数据,网络请求获取的数据等等)都需要放在ViewModel中。这样你的Controller看上去就十分简洁。只剩下View的引入,赋值给View,别人修改你的代码也会很快。以下是我目前项目中使用的一个ViewModel.

    @interface ApplyForUpgradeViewModel : NSObject

    /**

    *  是否是自愿改签,默认是YES

    */

    @property (nonatomic,assign) BOOL  isVoluntary;

    /**

    *  是否申请改签为同一航班,默认是YES

    */

    @property (nonatomic,assign) BOOL  isApplySameAirline;

    /**

    *  要申请改签的乘客

    */

    @property (nonatomic,strong) NSMutableArray  *  exsitPersonsArray;

    /**

    *  期望时间

    */

    @property (nonatomic,copy) NSString  *  hopeDate;

    /**

    *  期望航司

    */

    @property (nonatomic,copy) NSString  *  hopeAirline;

    @property (nonatomic,copy) NSString  *  hopeTime;

    @property (nonatomic,copy) NSString  *  hopeClass;

    @property (nonatomic,copy) NSString  *  remark;

    /**

    *  遍历得到已经存在的乘客

    *

    *  @return 已经存在的乘客

    */

    - (FltPassenger  *)findHasContainPersonInPassengers:(FltPassenger  *)passenger;

    /**

    *  刷新局部的tableview

    *

    *  @param tableView 指定的tableview

    *  @param section  指定的section

    *  @param row      指定的row

    */

    - (void)reloadTableview:(UITableView  *)tableView  withSection:(NSInteger)section  andRow:(NSInteger)row;

    /**

    *  检查是否所有必传字段已经赋值

    *

    *  @return

    */

    - (BOOL)checkRequestWithSelectFlight:(FlightClassDataItem *)selectFlight;

    @end

    三.ViewModel使用时的一些误区

       我们习惯了对于MVC的认识,认为一个Model,一个View,一个Controller就是配套的,就是一对一的关系。所以也导致一个错误的认识,一个Controller也必须对应一个ViewMolde。这种认识是不对的。

       ViewModel是干嘛的,是Controller的server,是他的服务员。只要其他的顾客也需要服务员的服务,并且顾客的需求十分相似,这个server完全能够给几个不同的顾客提供相同的服务,可能只是服务费不同罢了。因此我们要知道,一个ViewModel其实是可以给不同的Controller提供方法处理,逻辑实现的地方。前提是这几个Controller有很多的相似的功能需要实现。只要你把ViewModel用的话,你的代码一定会变得好看,也利于修改和扩展。

      以上只是个人在Coding的时候一些心得,有不当之处,敬请指正。

    相关文章

      网友评论

      • Maj_sunshine:看了两篇mvvm的文章。 能不能问下 mvvm中主要抽离控制器的什么啊 网络请求么 用户的交互不用抽吧。我有点菜 啥都抽 什么网络请求 试图创建 tableview代理全抽。。 感觉一个group文件好多。:disappointed_relieved:
        码工人生:@学污直径 请求抽下,用户交互不抽

      本文标题:对于MVVM中的ViewModel的使用总结

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