凡是不拿代码做讲解, 只说纯理论的都是耍流氓!
前言: MVP用了几年了, 一直没整理过思路, 恰好最近有点时间, 整理一下, 写了个Demo分析下我用的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变简单了, 因为代码逻辑清晰了
然后, 是我对MVP的理解画的一张拓扑图:
QQ20180426-150230@2x.png
OK! 上代码!
首先是我的一个界面的文件目录
0E73B499-8F7B-443B-B62D-D891099E9E0A.png
ViewController里的代码
控制器现在主要责任就是添加子视图上来, 然后绑定一个或多个Presenter↓↓↓↓↓↓然后给presenter发指令(让它控制view显示)
QQ20180426-150637@2x.png
关键来了: Presnter.h中的代码
它可以接受外部的指令, 让它干啥它干啥, 比如我这里就是可以在控制器中告诉这个presenter小弟 "给老子请求数据去"
QQ20180426-150851@2x.png
然后就是Presenter.m中的代码
控制器大哥让我请求数据,我就得实现请求数据的方法, 请求完事以后当然就是拜托我的搭档(绑定的子view)更新数据,
QQ20180426-151525@2x.png
然后呢?没有然后了, 这就完事了, 套路就是这个套路
controller: 发指令+装载子view
Presenter: 执行控制器指令+更新子View
子view: 更新数据+把事件传递给Presenter处理
Model: 有我啥事....我就是打酱油的
后续:
Q: 点击cell跳转另一个界面怎么做?
A: 子View把事件传给Presenter -> Presenter传给控制器执行
github示例代码地址:
https://github.com/DuncanLii/MVPDemo.git
网友评论