一、设计模式的简单介绍

MVP的 V 层是由UIViewController 和UIView 共同组成
view 将委托presenter 对它自己的操作,(简单来说就是presenter发命令来控制view的交互,要你隐藏就隐藏,叫你show 你就乖乖的show)
presenter拥有对 view交互的逻辑(就是上面说的意思)
presenter跟model层通信,并将数据转化成对适应UI的数据并更新view
presenter不需要依赖UIKit
view层是单一,因为它是被动接受命令,没有主动能力

二、设计模式中的通信方式

presenter 作为业务逻辑的处理者,首先要向Service层拿数据赋值给model,所以它将可以向model层通信。其次,UI的处理权移交给了它,所以它需要与view成通讯,发送命令更新UI。同时,UI的响应将触发业务逻辑的处理,所以view 层向presenter层通讯,告诉他用户做了什么操作,需要你反馈对应的数据来更新UI。这样就完成了从用户交互获得交互反馈到整个业务逻辑。
 
三、设计模式的实现
1.UserViewProtocol 协议定义了一下方法,这些方法其实就是presenter对view层发送的命令:
#import "UserModel.h"

@protocol UserViewProtocol <NSObject>

- (void)userViewDataSource:(NSArray<UserModel *> *)data;
- (void)showIndicator;
- (void)hideIndicator;
- (void)showEmptyView; @end

2.协议中的几个方法实现

- (void)userViewDataSource:(NSArray<UserModel *> *)data {

    self.friendlyUIData = data;

    [self.tableView reloadData];

}

- (void)showIndicator {

    [self.indicatorView startAnimating];

    self.indicatorView.hidden = NO;

}

- (void)hideIndicator {

    [self.indicatorView stopAnimating];

}

- (void)showEmptyView {

    UIAlertController *alertView = [UIAlertController alertControllerWithTitle:@"Alert"message:@"show empty view" preferredStyle:UIAlertControllerStyleAlert];

    [alertView addAction:[UIAlertAction actionWithTitle:@"确定"style:UIAlertActionStyleDefault handler:**nil**]];

    [self presentViewController:alertView animated:YES completion:^{

    }];

}

3.是presenter 可以直接拿到实现了UserViewProtocol 协议的对象,并且向他发送命令

@interface Presenter : NSObject

/**

 将一个实现了 UserViewProtocol 协议的对象绑定到 presenter上来

 @param view 实现了UserViewProtocol的对象,一般来说,应该就是控制器,在MVP中,V 和 VC 共同组成UI 层

 */

- (void)attachView:(id <UserViewProtocol>)view;

/**

 这个是对外的入口,通过这个入口,实现多个对内部的操作,外部只要调用这个接口就可以了

 */

- (void)fetchData;

@end

 

by:ml

  

mvp设计模式的更多相关文章

  1. 通过TodoList案例对比Vue.js的MVVM设计模式与JQuery的MVP设计模式

    Vue MVVM设计模式: 在使用vue进行编程时,不会再涉及到DOM的操作,取而代之的是修改数据层,当把数据进行变更的时候,vue之中它的底层会自动的根据数据的不同帮助我们去重新渲染页面. 编码时不 ...

  2. Android之MVP设计模式

    一.概述 MVP设计模式的前身是MVC,这个无需再议 在安卓工程中MVC对应关系如下: Layout->View : 对应布局文件Activity->Controller,View (其中 ...

  3. android开发系列之MVP设计模式

    最近在开发一个android的项目中,发现了一个很实用的设计模式(MVP).大家可能一看到这个名字就有点蒙,MVP到底是什么鬼呢?它的好用到底体现在哪呢?别着急,下面就让我们一一分享出来. 说到MVP ...

  4. Android学习探索之运用MVP设计模式实现项目解耦

    前言: 一直致力于提高开发效率降低项目耦合,今天想抽空学习一下MVP架构设计模式,学习一下如何运用到项目中. MVP架构设计模式 MVP模式是一种架构设计模式,也是一种经典的界面模式.MVP中的M代表 ...

  5. MVC和MVP设计模式

    参考博客http://www.cnblogs.com/end/archive/2011/06/02/2068512.html ####MVC模式M:model 模型V:view 视图C:control ...

  6. MVC,MVP设计模式

    什么是MVP MVP是模型(Model).视图(View).主持人(Presenter)的缩写,分别代表项目中3个不同的模块. 模型(Model):负责处理数据的加载或者存储,比如从网络或本地数据库获 ...

  7. 浅谈MVP设计模式

    最近公司在做一个医疗项目,使用WinForm界面作为客户端交互界面.在整个客户端解决方案中.使用了MVP模式实现.由于之前没有接触过该设计模式,所以在项目完成到某个阶段时,将使用MVP的体会写在博客里 ...

  8. android MVP设计模式!

    实现原理: MainActivity 用来更新UI,和显示业务逻辑的结果! LoginPresenterCompl 用来处理 业务逻辑 ILoginPresenter 业务处理类抽象出来的接口 ILo ...

  9. Android MVP 设计模式

    1.基本概念 Model    : 模型   负责处理数据的加载或者存储,比如从网络或本地数据库获取数据等: View     : 视图    负责界面数据的展示,与用户进行交互: Presenter ...

随机推荐

  1. 轻松掌握mongodb

    mongodb 是一种非关系型的,面向文档的数据库,也是nosql类的产品 memcache,redis等等 与mysql最大的区别:mongodb 使用javascript语言操作,保存是以json ...

  2. decodeURI 与 decodeURIComponent 区别

    1. 关于URL.encodeURI 及 encodeURIComponent: URI: Uniform Resource Identifiers,通用资源标识符 Global 对象的 encode ...

  3. NetworkX系列教程(10)-算法之四:拓扑排序与最大流问题

    小书匠Graph图论 重头戏部分来了,写到这里我感觉得仔细认真点了,可能在NetworkX中,实现某些算法就一句话的事,但是这个算法是做什么的,用在什么地方,原理是怎么样的,不清除,所以,我决定先把图 ...

  4. python快捷键的使用【摘抄】

    接触python有些快捷键还不熟悉,搜索到下面这个文章很好的转发和摘抄了,感谢作者的用心分析 摘抄来源:https://www.cnblogs.com/haiyan123/p/7170593.html ...

  5. [Go] 基础系列一: for-select中的break、continue和return

    break select中的break,类似c系列中的break,break后的语句不执行 for和select一同使用,有坑 break只能跳出select,无法跳出for package test ...

  6. codeforces319C

    C. Kalila and Dimna in the Logging Industry time limit per test 2 seconds memory limit per test 256 ...

  7. 【scikit-learn】06:make_blobs聚类数据生成器

      版权声明:本文为博主原创文章,遵循CC 4.0 by-sa版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/kevinelstri/article/ ...

  8. Python 自学笔记(八)

    import math def A(a,b): print("第一个参数的值为"+str(a)) print("第一个参数的值为"+str(b)) a = 1 ...

  9. Flutter移动电商实战 --(45)详细页_说明区域UI编写

    pages/details_page/details_expain.dart 详情页面引用组件 效果展示: 最终代码: import 'package:flutter/material.dart'; ...

  10. 个微信小程序云开发云函数

    1. project.config.json写上云函数所在目录"cloudfunctionRoot": "cloudfunctions/",如图 2. app. ...