iOS架构设计04-MVP - 简书
source link: https://www.jianshu.com/p/e02dd1c5f52e?
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
iOS架构设计04-MVP
上篇文章我们介绍了MVC的变种
,今天我们来介绍下另一种常用的架构MVP
,我们看下图其实这个架构和Apple版MVC
很像,只不过C
换成了P
那我们来看看MVP是哪三个角色
- Model
对于
Model
层也是数据层。它区别于MVC架构中的Mode
l,在这里不仅仅只是数据模型。在MVP
架构中Model
它负责对数据的存取操作,例如对数据库的读写,网络的数据的请求等。
是显示数据
(model)
并且将用户指令(events)
传送到presenter
以便作用于那些数据的一个接口。View
通常含有Presenter
的引用。在这里通常指我们ViewController
- Presenter
我们看
Presenter
的意思是主持人,既然是主持人,那肯定要来主持工作了,对于Presenter
层他是连接View层
与Model层
的桥梁并对业务逻辑进行处理。在MVP
架构中Model
与View
无法直接进行交互。所以在Presenter层
它会从Model层
获得所需要的数据,进行一些适当的处理后交由View层
进行显示。这样通过Presenter
将View
与Model
进行隔离,使得View
和Model
之间不存在耦合,同时也将业务逻辑从View
中抽离
Demo实例讲解
下面我们还是沿用MVC那个Demo
来看,(主要功能就是我们自定义个XXAppView
,用来显示上面一张图,下面一行字的控件)
这次首先我们创建我们的Presenter
@interface XXAppPresenter() <XXAppViewDelegate>
@property (weak, nonatomic) UIViewController *controller;
@end
@implementation XXAppPresenter
- (instancetype)initWithController:(UIViewController *)controller
{
if (self = [super init]) {
self.controller = controller;
// 创建View
XXAppView *appView = [[XXAppView alloc] init];
appView.frame = CGRectMake(100, 100, 100, 150);
appView.delegate = self;
[controller.view addSubview:appView];
// 加载模型数据
XXApp *app = [[XXApp alloc] init];
app.name = @"QQ";
app.image = @"QQ";
// 赋值数据
[appView setName:app.name andImage:app.image];
}
return self;
}
#pragma mark - XXAppViewDelegate
- (void)appViewDidClick:(MJAppView *)appView
{
NSLog(@"presenter 监听了 appView 的点击");
}
接着我们修改下我们的View
,这次我们的View
不需要持有Model
,直接暴露出需要的数据给外界,
- (void)setName:(NSString *)name andImage:(NSString *)image;
最后我们来修改下Controller
,这回我们点击事件Delegate
不用Controller
来遵循了,因为我们交由Presenter
来主持管理了,所以由Presenter
来遵循,那我们的Controller
需要持有Presenter
对象,那现在我们的Controller
只负责初始化Presenter
就可以了
@interface ViewController ()
@property (strong, nonatomic) XXAppPresenter *presenter;
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
// 初始化我们的Presenter
self.presenter = [[MJAppPresenter alloc] initWithController:self];
}
那首先我们看看MVP
的优缺点
对
Controller
进行瘦身,View
和Model
之间不存在耦合,同时也将业务逻辑从View
中抽离,复用性更好
由于对视图的渲染放在了
Presenter
中,所以视图和Presenter
的交互会过于频繁。还有一点需要明白,如果Presenter
过多地渲染了视图,往往会使得它与特定的视图的联系过于紧密。一旦视图需要变更,那么Presenter
也需要变更了
之前我们也说了架构这种东西是没有唯一的,今天只是说了我理解和实现的一种方案,其实有很多种方案,我们定了这三个角色之后,这三个角色之间怎么交互,大概的交互流程规定好就可以,具体的细节,可以根据你的习惯或者项目的不同进行修改
今天就先介绍到这里,明天我们来看看MVVM
,还有近期在学习数据结构和算法
,小程序
,Flutter
,我会把笔记都记录下来的
点此进入我的博客也会同步更新
One More Thing
点击查看 2020—课程列表 全网IT各种资源有需求的可以微我,或者你喜欢的课程都可以给我发链接剩下的我来搞定
喜欢的朋友可以扫描关注我的公众号(多多点赞,多多打赏,您的支持是我写作的最大动力)关注有福利可以使用免费梯子自由上网
Recommend
About Joyk
Aggregate valuable and interesting links.
Joyk means Joy of geeK