42

iOS架构设计04-MVP - 简书

 4 years ago
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.
neoserver,ios ssh client

iOS架构设计04-MVP

0.1652020.03.09 23:04:16字数 958阅读 182

上篇文章我们介绍了MVC的变种,今天我们来介绍下另一种常用的架构MVP,我们看下图其实这个架构和Apple版MVC很像,只不过C换成了P

webp

那我们来看看MVP是哪三个角色

  • Model

对于Model层也是数据层。它区别于MVC架构中的Model,在这里不仅仅只是数据模型。在MVP架构中Model它负责对数据的存取操作,例如对数据库的读写,网络的数据的请求等。

是显示数据(model)并且将用户指令(events)传送到presenter以便作用于那些数据的一个接口。View通常含有Presenter的引用。在这里通常指我们ViewController

  • Presenter

我们看Presenter的意思是主持人,既然是主持人,那肯定要来主持工作了,对于Presenter层他是连接View层Model层的桥梁并对业务逻辑进行处理。在MVP架构中ModelView无法直接进行交互。所以在Presenter层它会从Model层获得所需要的数据,进行一些适当的处理后交由View层进行显示。这样通过PresenterViewModel进行隔离,使得ViewModel之间不存在耦合,同时也将业务逻辑从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进行瘦身,ViewModel之间不存在耦合,同时也将业务逻辑从View中抽离,复用性更好

由于对视图的渲染放在了Presenter中,所以视图和Presenter的交互会过于频繁。还有一点需要明白,如果Presenter过多地渲染了视图,往往会使得它与特定的视图的联系过于紧密。一旦视图需要变更,那么Presenter也需要变更了

之前我们也说了架构这种东西是没有唯一的,今天只是说了我理解和实现的一种方案,其实有很多种方案,我们定了这三个角色之后,这三个角色之间怎么交互,大概的交互流程规定好就可以,具体的细节,可以根据你的习惯或者项目的不同进行修改

今天就先介绍到这里,明天我们来看看MVVM,还有近期在学习数据结构和算法小程序Flutter,我会把笔记都记录下来的

点此进入我的博客也会同步更新

One More Thing

点击查看 2020—课程列表 全网IT各种资源有需求的可以微我,或者你喜欢的课程都可以给我发链接剩下的我来搞定

喜欢的朋友可以扫描关注我的公众号(多多点赞,多多打赏,您的支持是我写作的最大动力)关注有福利可以使用免费梯子自由上网

iOS_DevTips

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK