跟着事务代码的增多,viewcontroller 变得越来越臃肿,使得后续保护变得困难。 每次新增或者改动,最简略就是在原有基础上新增或改动,但是这并非正确,当然每次改动就重构一次,尽管抱负但是不太实际。本文经过对各种架构形式进行讨论,使得不降低阅读力的情况下,减少各个类的代码量。

传统的开发步骤,新建一个vieController,经过接口恳求,将数据封装成数据模型,渲染在tableview的cell上,viewController承担了数据的获取和处理,以及页面加载,显示,交互逻辑,全体代码都在viewController上

1.MVC

iOS 降低viewController颗粒度

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层的事务逻辑

iOS 降低viewController颗粒度

iOS 降低viewController颗粒度

依据图片能够看出,在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去完结,这儿不再展开

iOS 降低viewController颗粒度

MVVM各层的职责和MVP的相似,VM对应P层,仅仅在MVVM的View层多了数据绑定的操作