1:说明,项目文件分为3种,model,view,presenter。分别是数据,视图和控制层。model全部继承于BaseRecord,view包括控制器viewcontroller和view。继承于BaseViewController和BaseView,presenter继承于BasePresenter.这里命名习惯的关系,所有的model类项目里均命名为record后缀。

2:之前的MVC中控制器内既展示页面也负责网络数据请求和处理,各种异常状态的判断,页面更新等等,逻辑较多,结构较乱,本demo将MVC中的viewcontroller内的部分拆分,将其中的网络请求,请求回调,数据转换的代码提出来,放到了presenter文件中.这样viewcontroller内只负责创建视图和更新视图即可,数据转换,数据的初始化都在record内进行,,每个viewcontroller都会绑定一个对应的presenter和record。

3:示例: viewcontroller内代码: 由于所有的viewcontroller都继承BaseViewcontroller,在BaseViewcontroller内将viewdidload方法后加入两个自定义方法 initData和initViews,后面所有的子类的初始化数据和初始化页面视图可以分别写在这两个方法中,当然如果不习惯也可以继续写在viewdidload方法内。

#import "GasStationViewController.h"@interface GasStationViewController ()<UITableViewDelegate,UITableViewDataSource>ProStrong UITableView *tableView;@end@implementation GasStationViewController
buildMVPInControllerM;- (void)initNavis{self.title = @"列表";
}- (void)initViews{_tableView = [[UITableView alloc] initWithFrame:CGRectZero style:UITableViewStyleGrouped];_tableView.delegate = self;_tableView.dataSource = self;_tableView.separatorStyle = UITableViewCellSeparatorStyleSingleLine;_tableView.tableFooterView = [UIView new];[_tableView registerClass:[UITableViewCell class] forCellReuseIdentifier:@"cell"];[self.view addSubview:_tableView];[_tableView makeConstraints:^(MASConstraintMaker *make) {make.edges.equalTo(self.view);}];
}- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{return self.presenter.dataArray.count;
}-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath{return W(100);
}-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"cell" forIndexPath:indexPath];GasStationRecord *record = self.presenter.dataArray[indexPath.row];cell.textLabel.text = record.address;return cell;
}- (void)handleSuccess{[_tableView reloadData];
}@end

presenter内的代码: presenter内有两个方法:controllerWillAppear和controllerDidLoad,此2个方法使P层跟控制器生命周期绑定,方便自定义网络请求的位置。 比如本来要在controller内的viewdidload请求或者viewwillappear里面发送请求 现在在该presenter文件的下两个方法内执行也有同样的效果。进一步分离p层和v层代码

#import "GasStationPresenter.h"@implementation GasStationPresenter
buildMVPInPresenterM;- (void)controllerWillAppear{[self task:GAS_STATION_LIST param:@{@"brand_id":@"0"} type:Post];
}- (void)taskBegin{}- (void)taskDone:(id)resp fromUrl:(NSString *)url{self.dataArray = [NSMutableArray arrayWithArray:[GasStationRecord mj_objectArrayWithKeyValuesArray:resp]];
}- (void)taskError:(NSString *)msg code:(NSInteger)code{[HBHUDTool showMessageCenter:msg];
}@end

model文件:

#import "BaseRecord.h"NS_ASSUME_NONNULL_BEGIN@interface GasStationRecord : BaseRecordProCopy NSString *address;
ProCopy NSString *city;
ProCopy NSString *close_desc;
ProCopy NSString *discount;
ProCopy NSString *distance;
ProCopy NSString *id;
ProCopy NSString *name;
ProCopy NSString *position;
ProCopy NSString *price;
ProCopy NSString *thumb;
ProCopy NSString *is_open;
ProCopy NSString *is_top;@end

这样就是一个简单的MVP的全部内容了,使用的时候注意在viewcontroller的.h内写上

    @interface GasStationViewController : BaseViewControllerbuildMVPInControllerH(GasStationPresenter);@end

其中 buildMVPInControllerH(GasStationPresenter); 是用来绑定viewcontroller和presenter用的,是个宏,意思是在头文件声明一个presenter的属性,在实现文件中也要写一个宏:buildMVPInControllerM;意思是这个presenter的get方法我自己写。

在presenter的头文件和实现文件中要分别写上对应的record的声明:

@interface GasStationPresenter : BasePresenter
buildMVPInPresenterH(GasStationRecord);ProStrong NSMutableArray *dataArray;@end

功能同上,绑定presenter和record,分离record和viewcontroller,在实现文件中:buildMVPInPresenterM;

这种写法是必须要有的。然后使用方法可以参照demo中的即可,在BasePresenter中封装了一些网络请求的方法和错误处理,具体可根据需求自己写定制,在baseviewcontroller中写了一些自定义的方法和属性,可根据需要定制。

其他的就是项目的文件目录和相关的类的设计了,比如在APPdelegate中我写了两个category,分别把原appdelegate要做的繁复的工作分离到了两个分类中,这样一来代码变得整洁清晰,改动和添加功能都不用到处翻代码了。 其他的就是一些工具类和宏的定义的使用,也不复杂。

有任何问题请提issue,或者联系我,QQ:892750407.欢迎大家提出批评~

下附GitHub地址:https://github.com/littleZhangqq/mvpTemplateProj

原文链接:http://zhangqq166.cn/archives/ios/ios_mvpdev/

本人创建了一个公众号,里面每天发一些教程进阶知识,有的是本人总结所得,有的是转载大神的文章,大家一起分享看。

初探iOS项目使用MVP模式相关推荐

  1. MVP模式在Android实际项目中的应用和优化

    注:本文阅读需要对MVP模式有基本了解. MVP模式已经出现有很长一段时间了,但是火起来是这两年的事情. 关于MVP的概览,介绍,乃至于教程,Demo,实例,网上都有很多,我也有一篇文章专门收录了一些 ...

  2. MVP模式在Android项目中的使用

    烦了在Activity中编写太多的代码,该app由我来主导.就选择用MVP模式. 概述 MVP是模型(Model).视图(View).主持人(Presenter)的缩写,分别代表项目中3个不同的模块. ...

  3. 浅谈Android中MVP模式用于实际项目中的问题与优化

    学习MVP不算久,前段时间才把公司的两个项目完全转换为MVP模式,改了下来,略有心得,给大家分享一下. 才开始学习使用MVP时,看到大家说了很多MVP的优点,代码复用,条理清晰等等.不过我改下来发现, ...

  4. iOS开发笔记--基于面向协议MVP模式下的软件设计

    传统模式下的开发 MVC MVVM 基于面向协议MVP的介绍 MVP实战开发 说在前面:  相信就算你是个iOS新手也应该听说过MVC的,MVC是构建iOS App的标准模板.随着时间的推移,在iOS ...

  5. Android开发MVP模式--项目实战

    1 前言 苏宁+App是苏宁易购集团零售云研发中心分销研发中心主要产品之一,由于项目处于初期阶段,业务逻辑复杂,导致业务需求变动快,常常在开发甚至测试过程中出现界面或者后台接口调整的情况. App客户 ...

  6. 【iOS】MVP模式

    文章目录 什么是MVP模式? 图解 从MVC到MVP 苹果的MVC 为何要从MVC到MVP? MVP MVP模式下的工程 MVP模式的优缺点 什么是MVP模式? MVP模式是MVC模式的一个演化版本, ...

  7. 仅需6步,教你轻易撕掉app开发框架的神秘面纱(3):构造具有个人特色的MVP模式

    1. MVP的问题 之前我们说过MVP模式最大的问题在于:每写一个Activity/Fragment需要写4个对应的文件,对于一个简易的app框架来说太麻烦了.所以我们需要对MVP进行一定的简化. 关 ...

  8. iOS开发的架构模式

    iOS开发的架构模式 0.VIPER 为了减轻Controller层负担的方法,而VIPER架构其实是将Controller再细分成三层,分别是View.Interactor.Presenter,已达 ...

  9. 2016年GitHub 排名前 100 的安卓、iOS项目简介(收藏)

    2016年GitHub 排名前 100 的安卓.iOS项目简介(收藏)   排名完全是根据 GitHub 搜索 Java 语言选择 (Best Match) 得到的结果, 然后过滤了跟 Android ...

  10. WinForm中的MVC模式--MVP模式

    本文主要介绍MVC模式在WINFORM中的实现,其实砖家们都称它为MVP模式,小弟E文不太好,真的是记不住那个P怎么拼写的.. MVC模式主要解决的问题就是将表示层和业务层进行分离,在以往做WINFO ...

最新文章

  1. 主流Java数据库连接池分析(C3P0,DBCP,TomcatPool,BoneCP,Druid)
  2. ajax java 插件_对JQuery中Ajax应用与jQuery插件的理解与笔记
  3. TCP协议属性设置之SO_REUSEADDR属性
  4. Spring Boot log4j2 configuration example
  5. 解决安装Weblogic domain卡住问题(Primeton BPS)
  6. Sentinel(二)之Quick Start
  7. Learning Cocos2d-x for WP8(7)——让Sprite动起来
  8. 台达asda-b2伺服驱动器说明书_台达解决方案提升粉末冶金液压机的控制精度
  9. import lombok 报错_Lombok注解@Getter @Setter详解
  10. 三言五载道不尽【追梦五年】
  11. CI/CD:DevOps背后的推动力
  12. 关于浏览器中copy, cut, paste捕获的总结
  13. 2021-2027全球与中国零售空间规划软件市场现状及未来发展趋势
  14. 淘宝商家再也看不到客户手机号了
  15. 日语假名小写怎么打出来?
  16. linux安装perf工具
  17. Markdown流程图
  18. Unity3D射击类游戏制作第一节--场景搭建
  19. 解决Manjaro系统安装MindMaster思维导图用不了(登录不了的问题)的问题,以及代替的方案
  20. 保护计算机组件免受esd,USB3.0接口的ESD防护设计

热门文章

  1. c++贪吃蛇源代码 完整版
  2. 傅立叶变换系列(二)傅立叶级数
  3. Linux software RAID 1 - root filesystem becomes read-only after a fault on one disk
  4. win10共享打印错误0x0000006_win7系统局域网无法共享惠普打印机提示0x000006be错误的解决方法...
  5. emmc/ufs, sd
  6. Python实现图形界面猜数字游戏(GUI)
  7. MSVC2019 QT6 环境下的 C++ 中文编程实现(一)
  8. 怎么隐藏自己电脑上的IP地址
  9. Jitsi的公网部署与SSL证书手动安装
  10. web项目登录报错:HTTP Status 500 - Error instantiating servlet class com.gxuwz.medical.web.servlet.LoginSer