iOS进阶之架构设计MVP(2)

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。顾名思义,

Model:与MVC中的model没有太大的区别。主要提供数据的存储功能,一般都是用来封装网络获取的json数据的集合。Presenter通过调用Model进行对象交互。

View:这个View可以是viewcontroller、view等控件。View负责界面展示和布局管理,向Presenter暴露视图更新和数据获取的接口

Presenter:作为model和view的中间人,从model层获取数据之后传给view,使得View和model解耦。Present中间层负责UI改变及时更新数据;数据的改变及时的更新UI

说了那么多,总得来说MVP的好处就是解除view与model的耦合,使得view或model有更强的复用性。MVP的面向协议式的编程思想。那么MVP模式又是怎样的呢?请看下图

  • Controller其实将view和viewController传递给了P层, 这样P层其实就拥有了控制器的权利, 完全可以行使控制器的职责.

  • Controller又持有Presenter, 那么它只需要调用P层暴露出的接口, 就完全可以完成整个业务逻辑和页面展示

  • 关于C端和P端的循环引用的问题, 直接用weak关键字就可以解决了

示例1

在这里插入图片描述

ViewController类则是UI层,它实现了tableview自己的协议,还实现了用户交互的协议 UserViewProtocol,也就说,presenter向UI层发送命令,其实是发给UI层的viewController,实际上是控制器来被动的更新UI。这个不管是MVC还是MVP,view的实际控制权应该都是viewController。


项目总体框架:

在这里插入图片描述
demo地址 https://github.com/linfeifei123/MVP.git

示例2

分析下我用的MVP结构的流程.
下面是一些常见问题
Q: 用MVP能解决什么问题?
A: 我不知道大牛们解决了什么问题, 反正我是把原本属于ViewController中的业务逻辑代码抽出到了Presenter中, 做到了展示层-业务层代码分离.
Q: 一个界面一般有一个UIViewController和多个子view, 那么有几个Presenter呢?
A: 一般做法是复杂界面一个子View对应一个Presenter(这个presenter绑定了这个子view), 简单界面一个控制器对应一个Presenter(这个presenter绑定了主view).
Q: 别人都说Presenter可以实现Model和View隔离, 怎么实现的呢?我的UITableView/UICollectionView这样需要很多数据的view怎么能做到隔离呢?
A: 把UITableViewDataSource也就是数据源代理设置为Presenter, 在Presenter中完成cell赋值
Q: 用MVP可以少写代码吗?
A: 用了MVP写的代码更多了, 但是改BUG变简单了, 因为代码逻辑清晰了

iOS-OC MVP结构的实际应用

这种做法我比较赞赏:https://github.com/DuncanLii/MVPDemo.git

总结:

看了很多文章,感觉MVP 很难理解,或者说没有明确的标准。P层有的过多又得过少很难拿捏,用不好用成MVC。其实记住MVP的核心:为了View 与Model 解耦。

比较权威的文章几乎没有,来看看这个MVP in iOS with swift,由于它里面的名字不利于理解,我改动一些类名字。改后的MVPDemo

其实MVP 与MVC的最大的不同在于用注重协议编程,数据请求与逻辑放到presenter中。presenter通过协议和View、VC通信,更新View的状态,来达到Model和View的解耦,同时减少VC中的代码。

下面几篇文章看了或许能帮助你理清实现。好慢慢消化。

感谢

iOS-OC MVP结构的实际应用
ios MVP的分析和理解
iOS-基于面向协议MVP模式下的软件设计–架构设计

IOS (oc) 浅谈MVP在ios项目中的使用以及Demo
Controller瘦身一:剥离UITableView,封装dataSource和deleagte
Controller瘦身二:面向协议编程MVP模式,对M和V进行解耦

发布了249 篇原创文章 · 获赞 224 · 访问量 20万+

猜你喜欢

转载自blog.csdn.net/shifang07/article/details/98748939