ios swift 实现简单MVP模式
在移动开发中,会用到各种架构,比如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模式的更多相关文章
- iOS设计模式 - (3)简单工厂模式
iOS设计模式 - (3)简单工厂模式 by Colin丶 转载请注明出处: http://blog.csdn.net/hitwhylz/article/ ...
- iOS设计模式之简单工厂模式
简单工厂模式 基本理解 到底要实例化谁,将来会不会增加实例化的对象,比如计算器增加开根运算,这是很容易变化的地方,应该考虑用一个单独的类来做这个创造实例的过程,这就是工厂. 通过使用工厂模式,我们可以 ...
- iOS设计模式:简单工厂模式
1.简述 首先需要说明一下,简单工厂模式不属于23种GOF设计模式之一.它也称作静态工作方法模式,是工厂方法模式的特殊实现(也就是说工厂模式包含简单工厂模式).这里对简单工厂模式进行介绍,是为后面的工 ...
- iOS Swift最简单的Animation
最近发现Animation是一个iOS开发中非常好玩的元素,能给应用的交互性增色不少.比如很多音乐应用的菜单从底部弹出和隐藏的效果. Animation最核心的当然就是UIView的animateWi ...
- iOS学习之MVC,MVVM,MVP模式优缺点
为什么要关注架构设计? 因为假如你不关心架构,那么总有一天,需要在同一个庞大的类中调试若干复杂的事情,你会发现在这样的条件下,根本不可能在这个类中快速的找到以及有效的修改任何bug.当然,把这样的一个 ...
- iOS 简单工厂模式
iOS 简单工厂模式 什么是简单工厂模式? 简单工厂模式中定义一个抽象类,抽象类中声明公共的特征及属性,抽象子类继承自抽象类,去实现具体的操作.工厂类根据外界需求,在工厂类中创建对应的抽象子类实例并传 ...
- iOS开发Swift篇—简单介绍
iOS开发Swift篇—简单介绍 一.简介 Swift是苹果于2014年WWDC(苹果开发者大会)发布的全新编程语言 Swift在天朝译为“雨燕”,是它的LOGO 是一只燕子,跟Objective-C ...
- 从最简单的HelloWorld理解MVP模式
版权声明:本文为博主原创文章,转载请注明出处:http://www.cnblogs.com/joy99/p/6116855.html 大多数编程语言相关的学习书籍,都会以hello,world这个典型 ...
- iOS开发-简单工厂模式
设计模式(Design pattern)是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结.设计模式是为了可重用代码.让代码更容易被他人理解.保证代码可靠性.概念很长,iOS开发中最常 ...
随机推荐
- 转:利用UDEV服务解决RAC ASM存储设备名
利用UDEV服务解决RAC ASM存储设备名 好文转载,链接:http://www.askmaclean.com/archives/utilize-udev-resolve-11gr2-rac-asm ...
- Nor Flash的CFI与JEDEC接口
Flash 存储器接口还有两个标准:CFI和JEDEC.CFI为公共Flash接口[Common Flash Interface],用来帮助程序从Flash芯片中获取操作方式信息(发送命令,从nor ...
- C# IL中间代码注入实现切面编程
背景及现状:之前分享的那篇“面向切面编程–渲染监控日志记录方案”中提供了利用RealProxy作为代理类来生成代理的面向切面的编程方法,那个方法可以实现面向切面编程进行日志记录,现在渲染主程序也是采用 ...
- Word中调整编号和文字的间距
鼠标放在节文字上,不用选择该级别的所有节点,直接在某一节上右键-段落-制表位-默认制表位-设置1字符或其它.完成后该级别所有节的格式都自动调整,不用一个个调整. 但是设置其它段落格式还是需要在菜单上选 ...
- PowerDesigner中添加约束
唯一约束 唯一约束与创建唯一索引基本上是一回事,因为在创建唯一约束的时候,系统会创建对应的一个唯一索引,通过唯一索引来实现约束.不过唯一约束更直观的表达了对应列的唯一性,使得对应索引的目的更加清晰,所 ...
- mysql 打印随机数
select rand(); 这样取出来的数据是类似这样的: 0.5389902438400223 要几位自己取几位: 取得方法类似 select substr(concat("000000 ...
- Android ListView 设置
android:minHeight="80dip"//设置每一条的高度 android:divider="@null" //设置默认的分割线不显示 androi ...
- Class类动态加载类的用法
编译时刻加载类出现的问题:一个功能有错,所有功能都用不了 动态加载类:
- 初阶html学习总结(一)(转)
一:颜色代码 如果你想使用某种颜色,取得它的颜色值即可.比如,您想改变某些文字的颜色,您可以使用下面的代码:<font color=#ffc060 size=2>改变#符号后的代码即可改变 ...
- 猪羊——HTML解析
HTML标签和属性大全见:http://www.cnblogs.com/Mr-liyang/p/5797976.html CSS样式大全:http://www.cnblogs.com/Mr-liyan ...