上一篇 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
示例2
分析下我用的MVP结构的流程.
下面是一些常见问题
Q: 用MVP能解决什么问题br> A: 我不知道大牛们解决了什么问题, 反正我是把原本属于ViewController中的业务逻辑代码抽出到了Presenter中, 做到了展示层-业务层代码分离.
Q: 一个界面一般有一个UIViewController和多个子view, 那么有几个Presenter呢br> A: 一般做法是复杂界面一个子View对应一个Presenter(这个presenter绑定了这个子view), 简单界面一个控制器对应一个Presenter(这个presenter绑定了主view).
Q: 别人都说Presenter可以实现Model和View隔离, 怎么实现的呢的UITableView/UICollectionView这样需要很多数据的view怎么能做到隔离呢br> A: 把UITableViewDataSource也就是数据源代理设置为Presenter, 在Presenter中完成cell赋值
Q: 用MVP可以少写代码吗br> 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进行解耦
声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!