iOS 框架 MVP

作者: LikeSomeBody | 来源:发表于2017-12-07 19:50 被阅读94次

    一 :前言

    从字面意思来理解,MVP 即 Modal View Presenter(模型 视图 协调器),MVP 实现了 Cocoa 的 MVC 的愿景。MVP 的协调器 Presenter 并没有对 ViewController 的生命周期做任何改变,因此 View 可以很容易的被模拟出来。在 Presenter 中根本没有和布局有关的代码,但是它却负责更新 View 的数据和状态。MVC 和 MVP 的区别就是,在 MVP 中 M 和 V 没有直接通信。

    MVP 是第一个如何协调整合三个实际上分离的层次的架构模式,既然我们不希望 View 涉及到 Model,那么在显示的 View Controller(其实就是 View)中处理这种协调的逻辑就是不正确的,因此我们需要在其他地方来做这些事情。例如,我们可以做基于整个 App 范围内的路由服务,由它来负责执行协调任务,以及 View 到 View 的展示。这个出现并且必须处理的问题不仅仅是在 MVP 模式中,同时也存在于以下集中方案中。

    1)MVP模式下的三个特性的分析:

    任务均摊 -- 我们将最主要的任务划分到 Presenter 和 Model,而 View 的功能较少;

    可测试性 -- 非常好,由于一个功能简单的 View 层,所以测试大多数业务逻辑也变得简单;

    易用性 -- 代码量比 MVC 模式的大,但同时 MVP 的概念却非常清晰。

    二:代码分析

    DEMO 下载地址 https://gitee.com/DeLongYang/iOSFrameWork  演示了如何 使用MVP 设计思想来 实现一个 类似 京东的首页。 读者可以使用MVP设计 的优点 面向协议编程 代码的耦合度低,可拓展性高。 如果UI需要增加新的页面元素 ,或者不觉发生改变 。 在主  ViewController 中的代码 并不需要改。 只需要新增model 或者协议方法 即可 关键的代码如下:

    - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{

    id model = [self.floorModel rowModelAtIndexPath:indexPath];

    UITableViewCell*cell = [tableView dequeueReusableCellWithIdentifier:model.floorIdentifier];

    [cell processData:model];

    NSLog(@"cell identifie is %@",model.floorIdentifier);

    [cell tapOneBlock:^(NSIndexPath *indexPath) { __weak typeof (self) weakSelf = self; if ([model conformsToProtocol:@protocol(TemplateActionProtocol)]) { TemplateAction *action = [(id)model actionAtIndexPath:indexPath];

    [weakSelf.actionHanlder handleAction:action];

    }

    }];

    if (!cell) {

    return [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:nil];

    }

    return cell;

    }

     整个页面类似于H5里面中行元素布局只是 每行就是一个 cell

    每个header 也是一行 每个margin 也是一行

    讲到单元测试 如果 MVP的 一个特点是可以 方便单元测试

    也就是数据可以是分段的 我们一次加载一部分的数据 以达到单元测试的目的 测试一下

    而不用影响其他的 在开发的过程中也是如此 一点点的加载数据

     实验发现如果没有设置 appTransport 选项 即使加载 http 的图片也无法加载出来

    2.0 返回的数据 是我们设计Model 数据层次的关键 和 刷新cell 的依据

    也是 我们设计 Protocols 的关键

    可以对比 Jason的结构  DEMO 中的   food.json 和 TemplateContainerMode 的结构 。 

    @interface TemplateContainerMode : NSObject//netList

    @property (nonatomic,strong) NSNumber                *identityId;

    @property (nonatomic,strong) NSString                *pattern;

    @property (nonatomic,strong) TemplateFHeaderModel    *fheader;

    @property (nonatomic,strong) NSArray                  *itemList;

    @property (nonatomic,strong) TemplateJumpModel        *jump;

    @property (nonatomic,strong) TemplateMarginModel      *margin;

    //other add

    @property (nonatomic,weak) TemplateChannelModel    *channelModel;

    @end

    每个 Mode 和 data.json 是 一一对应 的。

    相关文章

      网友评论

        本文标题:iOS 框架 MVP

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