1.什么是MVP?

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

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

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

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

整个交互流程看起来大致是这样的:

用户交互->View获得交互事件->View将事件转发给Presenter->Presenter调用Model获取新数据->Presenter将数据推送给View进行展示

案例1:

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

class loginPresenter: NSObject {
//声明V和M2个属性,其中的V中写了代理,待优化
private var loginViewDelegate:LoginViewDelegate?
private var loginModel:LoginModel? //实例化
override init() {
//model实例化
self.loginModel = LoginModel()
} //V层调用这个login方法,这个方法再调用M层的login方法
func login(usrName: String, pwd: String) {
self.loginModel?.login(usrName: usrName, pwd: pwd, callback: { (result) in
//从m层的的回调,回调到v层去,同样还是通过一个代理实现
self.loginViewDelegate?.onLoginResult(result: result)
})
} //绑定V和P
func attachView(viewDelegate:LoginViewDelegate) {
self.loginViewDelegate = viewDelegate
} //解除绑定,假如网络请求是,viewController已经释放,则无需再回调更新UI
func detachView() {
self.loginViewDelegate = nil
} }

Presenter

import Foundation
//M层
class LoginModel: NSObject {
//登陆的方法,P层调用这个方法来发起登陆请求
func login(usrName:String,pwd:String,callback:((String)->Void)) {
//发起网络请求 处理方法要封装,不能耦合
print("进入model")
//调用网络模块方法
HttpUtils.post(usrName: usrName, pwd: pwd) { (result) in
//1,处理网络返回的情况,如:登录成功要缓存个人信息
//......
//2,完成登录数据处理,回调给P层,这里不与UI部分耦合
callback(result)
} } }

Model

import UIKit
//遵循LoginViewDelegate协议
class ViewController: UIViewController,LoginViewDelegate { //定义一个presenter,实例化
private let presenter = loginPresenter() override func viewDidLoad() {
super.viewDidLoad()
//添加v和p2层的绑定
self.presenter.attachView(viewDelegate: self)
//UI层交互操作,发起登录请求
self.presenter.login(usrName: "ZZB", pwd: "") } //依据P层的回调数据进行V层UI更新
func onLoginResult(result: String) {
print("处理P层返回的数据: \(result),更新UI")
} override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
//页面注销的时候解除绑定
self.presenter.detachView()
} }

ViewController

案例2:

class ViewController: UIViewController {

    fileprivate lazy var presenter : ViewPresenster = {
return ViewPresenster(presenter: self)
}() override func viewDidLoad() {
super.viewDidLoad()
} override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
presenter.getData()
}
} // MARK:- 获取数据//
extension ViewController:ViewPresensterProtocol{ func showPost(_ resulet: [DCModel]) {
print(resulet)
}
}

ViewController

import UIKit

protocol ViewPresensterProtocol {
func showPost(_ resulet: [DCModel])
} class ViewPresenster: NSObject {
var presenter: ViewPresensterProtocol!
lazy var model:[DCModel] = [DCModel]()
init(presenter:ViewPresensterProtocol) {
self.presenter = presenter;
} func getData(){
let dict = [
["user_id":"","user_name":"zhaodacai1"],
["user_id":"","user_name":"zhaodacai2"],
["user_id":"","user_name":"zhaodacai3"],
["user_id":"","user_name":"zhaodacai4"],
["user_id":"","user_name":"zhaodacai5"],
["user_id":"","user_name":"zhaodacai6"],
["user_id":"","user_name":"zhaodacai7"]
] for item in dict {
model.append(DCModel(dict: item))
} self.presenter.showPost(model)
} }

Presenter

import UIKit

class DCModel: NSObject {

    // 用户ID
var user_id : String = "" // 用户名字
var user_name : String = "" init(dict : [String : Any]) {
super.init()
setValuesForKeys(dict)
} override func setValue(_ value: Any?, forUndefinedKey key: String) {}
}

Model

参考链接:

【Swift实现代码】iOS架构模式之MVP的更多相关文章

  1. iOS 架构模式-MVVM

    iOS 架构模式-MVVM MVVM Model-View-ViewModelMVVM 其实是MVC的进化版,他将业务逻辑从VC中解耦到ViewModel,实现VC的瘦身. 做一个简单的登录判断: 创 ...

  2. iOS 架构模式--解密 MVC,MVP,MVVM以及VIPER架构

    本文由CocoaChina译者lynulzy(社区ID)翻译 作者:Bohdan Orlov 原文:iOS Architecture Patterns 在 iOS 中使用 MVC 架构感觉很奇怪? 迁 ...

  3. iOS - 架构模式 - 解密 MVC、MVP、MVVM、VIPER架构

    在 iOS 中使用 MVC 架构感觉很奇怪? 迁移到MVVM架构又怀有疑虑?听说过 VIPER 又不确定是否真的值得切换? 相信你会找到以上问题的答案,如果没找到请在评论中指出. 你将要整理出你在 i ...

  4. iOS架构模式浅析

    这是以前旧博客在13年规划写的一个系列,写了一部分内容,还没有完成.现在重新整理编写.计划从基础知识六大设计原则.设计模式中类的关系开始,然后会对iOS开发中的常用架构模式进行介绍,最后对GoF的23 ...

  5. iOS 架构模式

    参考:http://www.cocoachina.com/ios/20160108/14916.html MVC , MVP , MVVM , VIPER

  6. iOS 架构模式MVVM

    MVVM Model-View-ViewModelMVVM 其实是MVC的进化版,他将业务逻辑从VC中解耦到ViewModel,实现VC的瘦身. 做一个简单的登录判断: 创建LoginViewMode ...

  7. iOS - 架构的认识过程,悬崖勒马。

    16年的时候写过一篇代码讲解的,依旧是这三种架构,现在20年将近了,看到好的文章,是否增加新的认识. 16年链接 iOS - 架构模式 - 解密 MVC.MVP.MVVM.VIPER架构 新项目选择架 ...

  8. iOS - MVP 架构模式

    1.MVP 从字面意思来理解,MVP 即 Modal View Presenter(模型 视图 协调器),MVP 实现了 Cocoa 的 MVC 的愿景.MVP 的协调器 Presenter 并没有对 ...

  9. 用户登录(Material Design + Data-Binding + MVP架构模式)实现

    转载请注明出处: http://www.cnblogs.com/cnwutianhao/p/6772759.html MVP架构模式 大家都不陌生,Google 也给出过相应的参考 Sample, 但 ...

随机推荐

  1. CSS3制作旋转导航

    慕课网学习CSS3时,遇到个习题,觉得有必要总结学习下:CSS3制作旋转导航 慕课网习题地址:http://www.imooc.com/code/1883 示例及源码地址:http://codepen ...

  2. gridView在view页面中的一些代码详细模板

    <?php use yii\helpers\Html; use yii\grid\GridView; use yii\widgets\Pjax; use frontend\models\Item ...

  3. 关于微信小程序的场景值

    微信小程序 “场景值”     对运营同学和产品比较有用一般开发者需在这里埋点,获取场景址,看一下小程序,用户一般从哪个路口进的有利于提升产品体验

  4. Net 常用资源

    opensource: http://www.dotnetfoundation.org/projects https://github.com/dotnet/corefx Enterprise Lib ...

  5. local unversioned, incoming add upon update问题

    当update的时候遇到如下问题 svn status D C ~/workspace/test/a.c > local unversioned, incoming add upon updat ...

  6. the age of the TCP connection TCP Slow Start

    w防止网络过载和拥塞 HTTP The Definitive Guide The performance of TCP data transfer also depends on the age of ...

  7. 转:JAVA.NET.SOCKETEXCEPTION: TOO MANY OPEN FILES解决方法

    最近随着网站访问量的提高把web服务器移到linux下了,在移服务器的第二天,tomcat频繁的报 java.net.SocketException: Too many open files错误,错误 ...

  8. 一行代码让python的运行速度提高100倍

    python一直被病垢运行速度太慢,但是实际上python的执行效率并不慢,慢的是python用的解释器Cpython运行效率太差. “一行代码让python的运行速度提高100倍”这绝不是哗众取宠的 ...

  9. Mysql文章笔记

    Mysql名词解释/含义/读书笔记 MVCC(Multiversion concurrency control) MySQL InnoDB存储引擎,实现的是基于多版本号的并发控制协议--MVCC (M ...

  10. 出现 Request Entity Too Large问题的解决方法

    根据经验判断应该是上传文件大小被限制了,检查了应用配置是10M,把它设置成100M,重启服务也不能解决问题. 原来我们的tomcat是通过nginx发现服务代理的,问题就出现nginx服务器上,原来n ...