在移动开发中,会用到各种架构,比如mvp,mvvm等,其目的就是为了让项目代码的可读性更好,减轻在android(activity) ios(controller)中的大量代码问题。接下来就开始我们的mvp入门之旅吧。

1.什么是MVP?

MVP是模型(Model)、视图(View)、主持人(Presenter)的缩写,分别代表项目中3个不同的模块。 

1.1 模型 (Model):负责处理数据的加载或存储

1.2 视图 (View):负责界面数据的展示与用户交互

1.3 主持人(Presenter):是Model和View之间的桥梁,将两者进行链接。

2.MVP的简单实践:

这里我们用app开发中常用的登录功能为例,用mvp来实现一个登录逻辑(功能)。既然用MVP 那么我们得新建三个类即:LoginModel,LoginPresenter,LoginView,代码如下:

2.1 LoginModel:

// 定义一个协议用于做登录结果的回调

protocol LoginDeletage {

func loginResult(result:String)

}

// 定义一个闭包来实现回调(功能和上面的协议一样,所以可以用协议或闭包来完成回调)

typealias LoginBlock = (_result:String)->Void

class LoginModel:NSObject{

//具体的登录实现逻辑(这里为了方便所以只是模拟了登录过程,实际过程在这里用网络请求完成登录验证即可)

func login(name:String,pwd:String,deletage:LoginDeletage){

if name =="admin"&& pwd =="123"{

deletage.loginResult(result:"登录成功")

}else{

deletage.loginResult(result:"账号或密码错误")

}

}

// 这里用闭包来实现回调其实和上面的功能都一样,只需要选择其中一种即可

func login(name:String,pwd:String,blok:LoginBlock){

if name =="admin"&& pwd =="123"{

blok("登录成功")

}else{

blok("账号或密码错误")

}

}

}

2.2 LoginView:

// 定义一个协议用来实现与界面交互需要的交互方法

protocol LoginView  {

// 这里只是使用了一个简单的登录结果显示方法,当然需要其它方法的时候只需要在这里添加相应的方法即可

func loginResult(result:String)

// .......还可以定义更多方法

}

2.3 LoginPresenter:

// 别忘了这里要实现在LoginModel中定义的协议

class LoginPresenter:NSObject,LoginDeletage{

// 持有LoginModel

private var model:LoginModel?

// 持有 LoginView

private var loginView:LoginView?

//在构造方法中传入LoginView

init(loginView:LoginView) {

self.loginView=loginView

self.model = LoginModel()

}

// 定义一个login方法供外部调用

func login(name:String,pwd:String) {

//这里调用通过协议的回调方式调用LoginModel中的login方法

//      self.model?.login(name: name, pwd: pwd,deletage: self)

//这里调用通过闭包的回调方式调用LoginModel中的login方法

self.model?.login(name: name, pwd: pwd, blok: {resultin

loginView?.loginResult(result: result)

})

}

// 实现协议里的方法

func loginResult(result:String) {

self.loginView?.loginResult(result: result)

}

}

3.以上三个类定义好了之后接下来开始测试,只需要在我们的viewController中调用即可:

//这里需要实现LoginView的协议

class ViewController:UIViewController,LoginView{

private var p:LoginPresenter?

overridefuncviewDidLoad() {

super.viewDidLoad()

self.p=LoginPresenter(loginView:self)

self.p?.login(name:"admin", pwd:"1234")

}

func loginResult(result:String) {

print("登录结果:",result)

}

}

4.总结:

至此,一个简单的MVP登录实现就出来了,是不是发现viewController中的代码很简洁明了。MVP 的好处是不是就体现出来了,比以往的传统模式来说viewController里就不再有那么多东西了吧。如果喜欢我的文章欢迎关注我哦,有什么问题可以留言大家一起交流学习!

简书:  Code人生

ios swift 实现简单MVP模式的更多相关文章

  1. iOS设计模式 - (3)简单工厂模式

    iOS设计模式 - (3)简单工厂模式           by Colin丶 转载请注明出处:              http://blog.csdn.net/hitwhylz/article/ ...

  2. iOS设计模式之简单工厂模式

    简单工厂模式 基本理解 到底要实例化谁,将来会不会增加实例化的对象,比如计算器增加开根运算,这是很容易变化的地方,应该考虑用一个单独的类来做这个创造实例的过程,这就是工厂. 通过使用工厂模式,我们可以 ...

  3. iOS设计模式:简单工厂模式

    1.简述 首先需要说明一下,简单工厂模式不属于23种GOF设计模式之一.它也称作静态工作方法模式,是工厂方法模式的特殊实现(也就是说工厂模式包含简单工厂模式).这里对简单工厂模式进行介绍,是为后面的工 ...

  4. iOS Swift最简单的Animation

    最近发现Animation是一个iOS开发中非常好玩的元素,能给应用的交互性增色不少.比如很多音乐应用的菜单从底部弹出和隐藏的效果. Animation最核心的当然就是UIView的animateWi ...

  5. iOS学习之MVC,MVVM,MVP模式优缺点

    为什么要关注架构设计? 因为假如你不关心架构,那么总有一天,需要在同一个庞大的类中调试若干复杂的事情,你会发现在这样的条件下,根本不可能在这个类中快速的找到以及有效的修改任何bug.当然,把这样的一个 ...

  6. iOS 简单工厂模式

    iOS 简单工厂模式 什么是简单工厂模式? 简单工厂模式中定义一个抽象类,抽象类中声明公共的特征及属性,抽象子类继承自抽象类,去实现具体的操作.工厂类根据外界需求,在工厂类中创建对应的抽象子类实例并传 ...

  7. iOS开发Swift篇—简单介绍

    iOS开发Swift篇—简单介绍 一.简介 Swift是苹果于2014年WWDC(苹果开发者大会)发布的全新编程语言 Swift在天朝译为“雨燕”,是它的LOGO 是一只燕子,跟Objective-C ...

  8. 从最简单的HelloWorld理解MVP模式

    版权声明:本文为博主原创文章,转载请注明出处:http://www.cnblogs.com/joy99/p/6116855.html 大多数编程语言相关的学习书籍,都会以hello,world这个典型 ...

  9. iOS开发-简单工厂模式

    设计模式(Design pattern)是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结.设计模式是为了可重用代码.让代码更容易被他人理解.保证代码可靠性.概念很长,iOS开发中最常 ...

随机推荐

  1. java写出进程条代码

    package com.ds; import java.awt.Color; import java.awt.Toolkit; import javax.swing.ImageIcon; import ...

  2. oralce 记一次 External Procedure initial connection 处理

    1 环境 oracle 11.2.0.4 RAC(2 nodes),centos 6.8,实体机 2 问题 线上环境执行一条sql sql> select ST_AsText(ST_Geomet ...

  3. python with open as f 写韩文中文乱码

    python3和python2的写法不一样具体如下: python3: with open(r'd:\ssss.txt','w',encoding='utf-8') as f: f.write(u'中 ...

  4. Celery-4.1 用户指南: Application(应用)

    Application Celery 库在使用之前必须初始化,一个celery实例被称为一个应用(或者缩写 app). Celery 应用是线程安全的,所以多个不同配置.不同组件.不同任务的 应用可以 ...

  5. 获取Linux权限后安装rootkit

    1.首先获得远程服务器的root权限,当然这是基本的也是最难的. 2.然后下载rootkit程序,本文用到的是mafix. 3.开始安装 wget http://godpock.googlecode. ...

  6. Navicat断网时连不上数据库

    最近安装了破解的Navicat,在有网的条件下可以连接本地安装的MySQL数据库,但断网之后就不可以,如下: 于是上网查资料,发现原因为: localhost可以看成是一个域名,在一大部分情况下,它能 ...

  7. sql语句中的问号是干什么的???

    1.实例代码一: String sql = "SELECT userid,name FROM tuser WHERE userid=? AND password=?" ;  pst ...

  8. c语言中argc和argv

    main函数的参数,解释如下: argc:命令行总的参数的个数,即argv中元素的格式. *argv[ ]:字符串数组,用来存放指向你的字符串参数的指针数组,每一个元素指向一个参数. argv[0]: ...

  9. sqlplus--sqlldr命令参数详解

    sqlplus--sqlldr参数详解 sqlldr,Oracle快速导入数据的工具,是sqlplus的指令,不是sql语法里的东西. 一.下面是SQL*LOADER的基本特点:1)能装入不同数据类型 ...

  10. oracle DML-(insert、select、update、delete)

    一.插入记录INSERT INTO table_name (column1,column2,...) values ( value1,value2, ...); 示例:insert into emp ...