一 :前言
从字面意思来理解,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 是 一一对应 的。
网友评论