ios架构设计,iOS编程 架构设计模式
MVP与MVC相比,presenter充当中间人,将VC逻辑迁移到此处。 正向: Presenter获取网络数据,通过代理向v通知行为,并跳转或更新UI。 相反: View用户交互触发,通过协议告诉Presenter我变了,而你的Presenter知道通过View的协议方法改变数据。 前面的iOS高级体系结构设计MVC(1)刚刚阐明了什么是真正的MVC,以及MVC相对于大型项目的缺点。 现在学习架构设计MVP吧。
MVP MVP模式是MVC模式的进化版本,所有模式似乎都来自MVC~~。 MVP的全名是Model-View-Presenter。 thdcs,
模型:与MVC的模型没有很大的区别。 主要提供数据的存储功能通常用于封装通过网络获取的json数据集合。 Presenter调用Model来交换对象。
视图:此视图可以控制视图控制器、视图等。 View负责界面的展示和布局管理,向Presenter暴露视图更新和数据获取的界面
presenter :作为model和view的中间人,从model层获取数据并传递给view,解除view和model的结合。 Present中间层负责UI的变更和及时的数据更新; 更改数据和及时更新UI
说了很多,反正MVP的好处是解除view和model的耦合,提高view或model的复用性。 MVP的面向协议的编程思想。 那MVP模式呢? 请参阅下图
控制器实际上将视图和视图控制器传递给p层,这样p层实际上拥有控制器的权利,可以完全行使控制器的职责。
Controller还拥有一个Presenter,因此只需调用暴露p层的接口,即可完全完成业务逻辑和整个页面的演示
关于c端和p端的循环参照问题,可以直接用weak关键字解决
例1
ViewController类是UI层,它提供了tableview独特的协议,并提供了与用户交互的协议UserViewProtocol。 也就是说,presenter向UI层发送命令实际上是发送到UI层的ViewController,实际上是控制器被动地更新UI,无论是MVC还是MVP,view的实际控制权都是view 项目总体框架:
demo地址https://github.com/linfei fei123/MVP.git
例2分析我使用的MVP结构的流程。
以下是一些常见问题
Q:可以用MVP解决什么问题?
我不知道a:zydm们解决了什么问题,总之我把原本属于ViewController的业务逻辑代码提取到Presenter中,实现了展示层-业务层代码分离。
Q:一个接口通常有一个UIViewController和多个子view,您有多少个Presenter?
A:的典型做法是在复杂接口的一个子视图中使用一个Presenter (该Presenter绑定着该子视图),在简单接口的一个控制器中使用一个Presenter
q:presenter据说可以隔离模型和视图,是怎么实现的呢? 像我的UITableView/UICollectionView这样需要大量数据的view怎么能隔离呢?
A:将UITableViewDataSource (数据源代理)设置为Presenter,并在Presenter中完成cell赋值
Q:可以不要用MVP写代码吗?
虽然A:增加了用MVP编写的代码,但修复错误变得简单了。 因为代码逻辑已经很清楚了
iOS-OC MVP结构的实际应用
这种做法我比较赞赏: https://github.com/Duncan LII/MVP demo.git
总结:读了很多文章,觉得MVP很难理解或者没有明确的标准。 p层太多或太少,很难拿,很难用于MVC。 其实请记住MVP的核心。 为View断开与模型的连接。
几乎没有权威的文章。 看看这个在IOs中使用的MVP交换机。 其中的名字不利于理解,所以要更改几个类名。 已修改的MVPDemo
其实MVP和MVC最大的区别是以协议为导向进行编程,将数据请求和逻辑放入presenter中。 presenter与协议和View、VC进行通信,通过更新View的状态,实现Model和View的解耦,同时减少VC内的代码。
阅读以下几篇文章,可能有助于组织实现。 慢慢消化。
感谢iOS-OC MVP结构的实用化
ios MVP的分析与理解
iOS-基于面向协议的MVP模式下的软件设计体系结构设计
浅谈MVP在ios(oc ) IOs项目中的使用及Demo
控制器瘦身法:剥离UITableView,封装数据来源和删除
控制器瘦身型二:面向协议编程MVP模式,去耦m和v