【Swift实现代码】iOS架构模式之MVP
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的更多相关文章
- iOS 架构模式-MVVM
iOS 架构模式-MVVM MVVM Model-View-ViewModelMVVM 其实是MVC的进化版,他将业务逻辑从VC中解耦到ViewModel,实现VC的瘦身. 做一个简单的登录判断: 创 ...
- iOS 架构模式--解密 MVC,MVP,MVVM以及VIPER架构
本文由CocoaChina译者lynulzy(社区ID)翻译 作者:Bohdan Orlov 原文:iOS Architecture Patterns 在 iOS 中使用 MVC 架构感觉很奇怪? 迁 ...
- iOS - 架构模式 - 解密 MVC、MVP、MVVM、VIPER架构
在 iOS 中使用 MVC 架构感觉很奇怪? 迁移到MVVM架构又怀有疑虑?听说过 VIPER 又不确定是否真的值得切换? 相信你会找到以上问题的答案,如果没找到请在评论中指出. 你将要整理出你在 i ...
- iOS架构模式浅析
这是以前旧博客在13年规划写的一个系列,写了一部分内容,还没有完成.现在重新整理编写.计划从基础知识六大设计原则.设计模式中类的关系开始,然后会对iOS开发中的常用架构模式进行介绍,最后对GoF的23 ...
- iOS 架构模式
参考:http://www.cocoachina.com/ios/20160108/14916.html MVC , MVP , MVVM , VIPER
- iOS 架构模式MVVM
MVVM Model-View-ViewModelMVVM 其实是MVC的进化版,他将业务逻辑从VC中解耦到ViewModel,实现VC的瘦身. 做一个简单的登录判断: 创建LoginViewMode ...
- iOS - 架构的认识过程,悬崖勒马。
16年的时候写过一篇代码讲解的,依旧是这三种架构,现在20年将近了,看到好的文章,是否增加新的认识. 16年链接 iOS - 架构模式 - 解密 MVC.MVP.MVVM.VIPER架构 新项目选择架 ...
- iOS - MVP 架构模式
1.MVP 从字面意思来理解,MVP 即 Modal View Presenter(模型 视图 协调器),MVP 实现了 Cocoa 的 MVC 的愿景.MVP 的协调器 Presenter 并没有对 ...
- 用户登录(Material Design + Data-Binding + MVP架构模式)实现
转载请注明出处: http://www.cnblogs.com/cnwutianhao/p/6772759.html MVP架构模式 大家都不陌生,Google 也给出过相应的参考 Sample, 但 ...
随机推荐
- 文艺青年、普通青年、2b青年到底是什么意思?
文艺青年.普通青年.2b青年到底是什么意思? 文艺青年就是脑子里跟别人想的不一样,思维跟人家相反或者另类的人. 普通青年呢就是像你一样,普普通通的. 2B青年就是黑铅笔青年,做事比较搞怪,古怪到让你哭 ...
- 160503、onunload、onbeforeunload事件详解
最近项目中做到一个功能:在上传页面用户开始上传文件之后用户点击任意跳转都需要弹出提示层进行二次确定才允许他进行跳转,这样做的目的是为了防止用户的错误操作导致这珍贵的UGC 流失(通常用户在一次上传不成 ...
- 谨防in、or 公用性能问题
今天遇到一个奇葩的问题:在where条件中用了 m in(×××) or m>=10,查询直接超时,我看了一下,数据库中就2万条数据 我将查询改为了union all 结果就不超时了
- c#获取QQ音乐当前播放的歌曲名
在网上找了很久,没找到方法,自己尝试着做,还是做出来了,很简单,就几句代码. Process[] ps = Process.GetProcessesByName("QQmusic" ...
- SOCKS5的出现缓解了各种具体协议需要专门设计代理协议的困难局面
socks5_百度百科 https://baike.baidu.com/item/socks5/8915011?fr=aladdin 如果您的机器具有一个合法的 Internet IP 地址, 或者您 ...
- jquery.dragsort.js 实现拖拽过程遇到的问题
.在IE下第一次拖动的时候,被拖动的li元素会不显示,查了很多资料发现是因为在IE中定位出了问题,li标签还在,只是位置计算出错.解决的办法是在li的css样式中position设置为relative ...
- C#中Datatable和List互相转换
其实早就该写的,哈哈,不过今天刚想起来注册,热热手,就写一下,哈哈. 直接上内容吧: 建立一个控制台应用程序, List<students> Studentlist = new List& ...
- python argparse命令行参数
测试: 第一个没有任何输出和出错 第二个测试为打印帮助信息,argparse会自动生成帮助文档 第三个测试为未定义的-v参数,会出错 第四个测试为未定义的参数foo,出错 positional arg ...
- (2.5)Mysql之SQL基础——数据类型
(2.5)Mysql之SQL基础——数据类型 关键词:mysql数据类型 目录: 一.整数型 二.小数型(以下均不能使用无符号) 三.日期时间型 四.字符串型 一.整数型 额外参数示例: int [( ...
- (2.4)Mysql之SQL基础——下载与使用测试库
(2.4)SQL基础——下载与使用测试库 1.查看与下载测试数据库 2.查看安装向导视图 3.安装 [1]安装:解压后用 mysql 命令安装(记得加上set autocommit=1) [2]核验: ...