在移动开发中,会用到各种架构,比如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. leetcode482

    这道题主要使用了C++的几个API,大小写转化,字符串替换.其余的逻辑都比较简单.而且经查资料,string类字符串拼接的速度使用+=的速度是很快的.以下代码,也是用的+=来拼接字符串. string ...

  2. ImageView 的 ScaleType

    /** * Options for scaling the bounds of an image to the bounds of this view. 将一个图片的边界缩放到这个view边界的几种选 ...

  3. 正确的停止java中的线程

    stop()方法不是一个正确的停止线程方法. 正确的停止方法:设置退出旗标

  4. android viewpage解决嵌套

    子viewpage 自定义 写法一: public class ChildViewPager extends ViewPager{ /** 触摸时按下的点 **/ PointF downP = new ...

  5. 【整理】使用AIDL跨进程传递复杂对象的实践例子

    首先定义对象类,并实现Parcelable接口,实现接口内的几个方法,看代码,Person.java package com.example.u3.aidltest; import android.o ...

  6. solr replication原理探究

    原文出自:http://sbp810050504.blog.51cto.com/2799422/1423199 无论是垂直搜索,还是通用搜索引擎,对外提供搜索服务其压力都比较大,经常有垂直电商在做活动 ...

  7. MyBatis配置Setting详细说明

    该表格转载自http://blog.csdn.net/summer_yuxia/article/details/53169227 setting是指定MyBatis的一些全局配置属性,这是MyBati ...

  8. [转]AJAX工作原理及其优缺点

    1.什么是AJAX?AJAX全称为“Asynchronous JavaScript and XML”(异步JavaScript和XML),是一种创建交互式网页应用的网页开发技术.它使用:使用XHTML ...

  9. Python01 python入门介绍

    1 python简介 1.1 为什么学python python(英国发音:/ˈpaɪθən/ 美国发音:/ˈpaɪθɑːn/), 是一种面向对象的解释型计算机程序设计语言,由荷兰人Guido van ...

  10. Angular01 利用grunt搭建自动web前端开发环境、利用angular-cli搭建web前端项目

    搭建angular开发环境 一.下载并安装node 官网地址:点击前往 二.利用npm安装cnpm 安装好node后就可以使用npm命令啦 查看版本:npm -v 安装cnpm:npm install ...