跟着事务代码的增多,viewcontroller 变得越来越臃肿,使得后续保护变得困难。 每次新增或者改动,最简略就是在原有基础上新增或改动,但是这并非正确,当然每次改动就重构一次,尽管抱负但是不太实际。本文经过对各种架构形式进行讨论,使得不降低阅读力的情况下,减少各个类的代码量。
传统的开发步骤,新建一个vieController,经过接口恳求,将数据封装成数据模型,渲染在tableview的cell上,viewController承担了数据的获取和处理,以及页面加载,显示,交互逻辑,全体代码都在viewController上
1.MVC
MVC形式,能够将数据的获取,封装,加工逻辑放在model里面,视图相关的都放在view里,Controller 只用处理数据同步和view的操作事情,这样能够降低Controller的代码量,一起view 和model也能够做到复用的可能,但是MVC也有问题
举例如下
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
BlogCellHelper *cellHelper = self.blogs[indexPath.row];
BlogTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:ReuseIdentifier];
cell.title = cellHelper.blogTitleText;
cell.summary = cellHelper.blogSummaryText;
cell.likeState = cellHelper.isLiked;
cell.likeCountText = cellHelper.blogLikeCountText;
cell.shareCountText = cellHelper.blogShareCountText;
//点赞的事务逻辑
__weak typeof(cell) weakCell = cell;
[cell setDidLikeHandler:^{
if (cellHelper.blog.isLiked) {
[self.tableView showToastWithText:@"你现已赞过它了~"];
} else {
[[UserAPIManager new] likeBlogWithBlogId:cellHelper.blog.blogId completionHandler:^(NSError *error, id result) {
if (error) {
[self.tableView showToastWithText:error.domain];
} else {
cellHelper.blog.likeCount += 1;
cellHelper.blog.isLiked = YES;
//点赞的事务展现
weakCell.likeState = cellHelper.blog.isLiked;
weakCell.likeCountText = cellHelper.blogTitleText;
}
}];
}
}];
return cell;
}
点赞的功用,经过cell的按钮事情改动数据源,这就使得view层和model层耦合起来,不能达到我们希望的view,model解耦的目的,另外关于杂乱界面或者杂乱的数据处理,使得View,model变得臃肿。
2.MVP
MVC的缺点在于并没有区分事务逻辑和事务展现, 这对单元测试很不友爱. MVP针对以上缺点做了优化, 它将事务逻辑和事务展现也做了一层阻隔, 对应的就变成了MVCP.
M和V功用不变, 原来的C现在只担任布局, 而一切的事务逻辑全都转移到了P层。P层处理完了事务逻辑,如果要更改view的显示,那么能够经过回调来完结,这样能够减轻耦合,一起能够单独测试P层的事务逻辑
依据图片能够看出,在MVC基础上,viewController 持有view层 和Present层,present 和model层交互获取数据,并加工数据,经过署理将View层进行显示。在view中子单元,以常见的UITableCell为例,cell其实不需求获取整个数据模型,仅仅需求数据模型中的几个特点值,这样的话就在cell与数据模型中心添加一层Present,将cell与数据模型解耦,cell就能够真正意义上完结重用。
3.MVVM
MVVM是在MVP基础上发展而来,那为什么要设计这种形式呢,以点赞为例,点击cell按钮—>调用P的点赞逻辑—->点赞成功后,P改动M的数据—>P回调Cell的署理方法改动cell的显示(点赞成功,赞的个数加1,一起点赞数变红,不然不改动赞的个数也不变色) 上面就是一个事情完好进程,能够看到要经过四步来完结,而且每次都要把P的状况同步到view,当事情多起来的时候,这样写就很麻烦了。那有没有一种简略的机制,让view的行为和状况和P的行为状况同步呢?
答案就是MVVM的binder机制。MVVM在完结中常常使用RAC去完结,这儿不再展开
MVVM各层的职责和MVP的相似,VM对应P层,仅仅在MVVM的View层多了数据绑定的操作