在移动开发中,会用到各种架构,比如mvp,mvvm等,其目的就是为了让项目代码的可读性更好,减轻在view(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里就不再有那么多东西了吧。如果喜欢我的文章欢迎关注我哦,有什么问题可以留言大家一起交流学习!
博客园: 猿哥爱码