-.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的时候一些心得,有不当之处,敬请指正。
网友评论