iOS-MVP模式

article/2025/9/23 1:27:03

前言

最近一段时间,公司刚做完一个MVP项目,我有一个习惯:在项目结项之后总结一下项目中新接触的问题。Google一下关键字“iOS MVP”,发现一些文章,最后是 这篇文章 带给我对MVP 的一些认识。MVP似乎有好多的变种,作者所说的这种有如下特点(以下是原文摘抄一段):

The characteristics of this variant are:*   the view part of the MVP consists of both UIViews and UIViewController*   the view delegates user interactions to the presenter*   the presenter contains the logic to handle user interactions*   the presenter communicates with model layer, converts the data to UI friendly format, and updates the view*   the presenter has no dependencies to UIKit*   the view is passiv (dump)

利用有道翻译如下:

  • MVP的 V 层是由UIViewController 和UIView 共同组成
  • view 将委托presenter 对它自己的操作,(简单来说就是presenter发命令来控制view的交互,要你隐藏就隐藏,叫你show 你就乖乖的show)
  • presenter拥有对 view交互的逻辑(就是上面说的意思)
  • presenter跟model层通信,并将数据转化成对适应UI的数据并更新view
  • presenter不需要依赖UIKit
  • view层是单一,因为它是被动接受命令,没有主动能力

presenter 作为业务逻辑的处理者,首先要向Service层拿数据赋值给model,所以它将可以向model层通信。其次,UI的处理权移交给了它,所以它需要与view成通讯,发送命令更新UI。同时,UI的响应将触发业务逻辑的处理,所以view 层向presenter层通讯,告诉他用户做了什么操作,需要你反馈对应的数据来更新UI。这样就完成了从用户交互获得交互反馈到整个业务逻辑。

示例代码如下:

首先看一下demo结构

UserViewProtocol 协议定义了一下方法,这些方法其实就是presenter对view层发送的命令:

/*** UserViewProtocol 协议定义了一下方法,这些方法其实就是presenter对view层发送的命令*/#import "UserModel.h"@protocol UserViewProtocol <NSObject>- (void)userViewDataSource:(NSArray<UserModel *> *)data;- (void)showIndicator;- (void)hideIndicator;- (void)showEmptyView;@end

UserService 类是用来请求数据给presenter的,我就只定义了一个方法:

- (void)getUserInfosSuccess:(SuccessHandler)success andFail:(FailHandler)fail;

这一层,其实也可以很复杂,这就涉及网络层的架构了,具体可以看一下网络层架构方面的博客或书籍 。

ViewController类则是UI层,它实现了tableview自己的协议,还实现了用户交互的协议 UserViewProtocol,也就说,presenter向UI层发送命令,其实是发给UI层的viewController,实际上是控制器来被动的更新UI。这个不管是MVC还是MVP,view的实际控制权应该都是viewController。

协议中的几个方法实现如下:

#pragma mark - UserViewProtocol- (void)userViewDataSource:(NSArray<UserModel *> *)data {self.friendlyUIData = data;[self.tableView reloadData];}- (void)showIndicator {[self.indicatorView startAnimating];self.indicatorView.hidden = NO;}- (void)hideIndicator {[self.indicatorView stopAnimating];}- (void)showEmptyView {UIAlertController *alertView = [UIAlertController alertControllerWithTitle:@"Alert"message:@"show empty view" preferredStyle:UIAlertControllerStyleAlert];[alertView addAction:[UIAlertAction actionWithTitle:@"确定"style:UIAlertActionStyleDefault handler:**nil**]];[self presentViewController:alertView animated:YES completion:^{}];}

另外,在viewDidload中,调用了presenter的两个public 方法,示例代码如下:

[self.presenter fetchData];- (Presenter *)presenter {if (_presenter == nil) {_presenter = [[Presenter alloc] init];[_presenter attachView:self];}return _presenter;}

下面来看看Presenter类:

先说attachView 方法,这个方法是对外公开的,目的就是为了将实现了UserViewProtocol 协议的对象(其实应该就是控制器,因为view的直接操作者就是view Controller)绑定到presenter 上,说白了就是presenter 可以直接拿到实现了UserViewProtocol 协议的对象,并且向他发送命令(协议实现的方法,前面有说到),具体该方法的实现:

#import <Foundation/Foundation.h>#import "UserViewProtocol.h"#import "UserModel.h"NS_ASSUME_NONNULL_BEGIN@interface Presenter : NSObject/**将一个实现了 UserViewProtocol 协议的对象绑定到 presenter上来@param view 实现了UserViewProtocol的对象,一般来说,应该就是控制器,在MVP中,V 和 VC 共同组成UI 层*/- (void)attachView:(id <UserViewProtocol>)view;/**这个是对外的入口,通过这个入口,实现多个对内部的操作,外部只要调用这个接口就可以了*/- (void)fetchData;@endNS_ASSUME_NONNULL_END

注意attachView属性其实就是我们平时使用委托协议( delegate),只是名字换成了attachView 而已,因为presenter和 viewController相互持有,所以必须要通过weak 来打破循环引用,所以必须要用weak修饰。

再来说fetchData方法:

公开这个方法,只是为了数据请求有个统一的接口,而不需要presenter分开多次调用,presenter自己处理所有事情,不让viewController参和进来,具体实现就看demo。

最后说一下presenter的私有方法:

/**如果数据比较复杂,或者UI渲染的数据只是其中很少一部分,将原数据处理,输出成UI渲染的数据。(题外话:这里其实还可以使用协议,提供不同的数据格式输出。)@param originData 原始数据@return 将原始数据转换为UI需要数据*/- (NSArray<UserModel *> *)processOriginDataToUIFriendlyData:(NSArray *)originData {NSMutableArray<UserModel *> *friendlyUIData = [NSMutableArray array];for (NSDictionary *dic in originData) {if ([[dic valueForKey:@"gender"] isEqualToString:@"male"]) {UserModel *model = [UserModel userWithDict:dic];[friendlyUIData addObject:model];}}return friendlyUIData;}

这个私有方法是将原始数据转换成UI所需要的数据,这样UI拿到数据就可以直接使用,而不用做各种判断,逻辑依然放在了presenter中。而且,这个数据处理可以做成协议,输出不同UI需要的数据,这个也可以看关于view架构的文章。

demo地址

更多文章

CocoaPods开源库的搭建
CocoaPods搭建私有库
CocoaPods搭建私有库遇到问题
CocoaPods私有库的升级维护
SKStoreReviewController之程序内评价
App应用程序图标的动态更换
开源框架 MGJRouter_Swift
iOS的MVP设计模式
iOS插件化
iOS FMDB的使用
Swift之ReactiveSwift
OC之ReactiveCocoa
OC之ReactiveCocoa进阶
iOS 性能考虑


http://chatgpt.dhexx.cn/article/AwZ1pdm2.shtml

相关文章

Android:安卓学习笔记之MVP模式的简单理解和使用

Android MVP模式的简单理解和使用 MVP模式1、 为什么使用MVP模式&#xff1f;1.1、实例说明 2、一步步让你理解MVP2.1、MVP实现第一步&#xff0c; 将页面拆分为M/V/P三个模块2.2、 MVP实现第2步&#xff0c; 使用接口通信&#xff0c;进一步解耦2.2.1、MVP遵从的面向对象原则 …

MVP开发模式解析

前言 由于项目里同事用到MVP开发模式&#xff0c;我看了几篇关于 MVP 的文章&#xff0c;对其有了基本的了解之后&#xff0c;便照猫画虎进行了开发&#xff0c;之后便再也没接触过 MVP。 最近空闲读了些MVP的文章&#xff0c;受益匪浅&#xff0c;于是打算写一篇关于MVP开发…

MVP模式的优缺点

MVP模式是MVC的一个演化版本&#xff0c;全称是Model view Presenter。 MVP能够有效的降低View的复杂性&#xff0c;避免业务逻辑被塞进View中,使得View变成一个混乱的“大泥坑”。 MVP模式会解除View与Model的耦合&#xff0c;同时又带来了良好的可扩展性&#xff0c;可测试…

Android MVP开发模式 google 官方Mvp架构详解(转)

Google官方MVP Sample代码解读 关于Android程序的构架, 当前最流行的模式即为MVP模式, Google官方提供了Sample代码来展示这种模式的用法.Repo地址: android-architecture.本文为阅读官方sample代码的阅读笔记和分析. 官方Android Architecture Blueprints [beta]:Android在如…

MVP模式的相关知识

MVP 是从经典的模式MVC演变而来&#xff0c;它们的基本思想有相通的地方&#xff1a;Controller/Presenter负责逻辑的处理&#xff0c;Model提供数据&#xff0c;View负责显示。作为一种新的模式&#xff0c;MVP与MVC有着一个重大的区别&#xff1a;在MVP中View并不直接使用Mod…

【iOS】MVP模式

文章目录 什么是MVP模式&#xff1f;图解 从MVC到MVP苹果的MVC为何要从MVC到MVP?MVP MVP模式下的工程MVP模式的优缺点 什么是MVP模式&#xff1f; MVP模式是MVC模式的一个演化版本&#xff0c;MVP全称Model-View-Presenter。&#xff08;关于MVC模式可见这篇文章&#xff09; …

浅谈安卓中的MVP模式

端午放假&#xff0c;天气下雨&#xff0c;于是乎在家撸一下博客&#xff0c;本篇博客将为大家解析MVP模式在安卓中的应用。 本文将从以下几个方面对MVP模式进行讲解&#xff1a; 1. MVP简介 2. 为什么使用MVP模式 3. MVP模式实例 4. MVP中的内存泄露问题 1. MVP简介&…

Android MVP模式 入门

1.前言 近些年来&#xff0c;Android架构模式有很多&#xff0c;我们比较熟知的有MVC&#xff0c;MVP以及MVVM&#xff0c;目前Android市场中使用最多的应该是MVP架构&#xff0c;虽然MVVM结合DataBing看似更加方便&#xff0c;但在一般公司中使用的还是比较少。其实模式这种东…

MVP模式实例解释

为什么在UI层包含太多的逻辑是很糟糕的&#xff1f;在既不手动运行应用程序&#xff0c;也不维护丑陋的自动执行UI组件的UI运行者脚本(runner script)的情况下&#xff0c;位于应用程序UI层中的代码是非常难于调试的。虽然这本身就是一个很大的问题&#xff0c;一个更大的问题是…

Android开发之MVP模式

前言&#xff1a;在之前的开发中一直用的是mvc模式搭建的项目&#xff0c;所以我对于mvp也一直只是停留在理论和demo阶段上。正好现在的项目是被小伙伴借助dragger搭建的mvp模式的结构&#xff0c;所以就想着总结整理一下mvp模式的东西并写出来&#xff0c;也算是作为自己使用了…

MVP模式与MVC模式

源地址&#xff1a;http://www.cnblogs.com/cuihongyu3503319/archive/2009/01/09/1372820.html MVP模式与MVC模式(转) MVP 是从经典的模式MVC演变而来&#xff0c;它们的基本思想有相通的地方&#xff1a;Controller/Presenter负责逻辑的处理&#xff0c;Model提供数据&#x…

MVP模式从入门到精通

首先附上自己写的一个MVP的demo&#xff0c;这是一个很标准的MVP&#xff0c;Github地址如下&#xff1a; https://github.com/SilasGao/MVPDemo 首先MVP 是从经典的MVC架构演变而来&#xff0c;那我们是不是要先说下何为MVC模式&#xff1f; 系统C/S(Client/Server)三层架构模…

MVP模式使用示例详解

什么是MVP模式? 这个MVP可不是腾讯游戏《王者荣耀》中的MVP。我们今天要讨论的MVP其实同MVC一样&#xff0c;是一种编程模式和思想&#xff0c;也许更准确地讲是一种架构。 MVP和MVC的区别 提到MVP模式&#xff0c;大家自然避免不了要和我们以前常用的MVC模式进行对…

MVP设计模式

Model–view–presenter (MVP) 是model–view–controller (MVC)设计模式派生出来的。MVP经常用来创建用户界面。 presenter是作为一个“中间人”的角色存在。在MVP中&#xff0c;所有页面显示逻辑都会被推送到presenter。 以下这张图是MVC模式的&#xff1a; MVP与MVC有着一…

Android中用到的MVP模式

参考&#xff1a;android架构设计—mvp模式封装 很简单&#xff0c;M&#xff1a;数据&#xff0c; V:界面&#xff0c; P:一个使唤数据(M)和界面(V)干活的大管家。 特点&#xff1a;在P的管理下&#xff0c;P可以直接支配V和M做一些事情。但是V&#xff0c;与M&#xff0c;你…

Android MVP模式 简单易懂的介绍方式

Android MVP Pattern Android MVP 模式1 也不是什么新鲜的东西了&#xff0c;我在自己的项目里也普遍地使用了这个设计模式。当项目越来越庞大、复杂&#xff0c;参与的研发人员越来越多的时候&#xff0c;MVP 模式的优势就充分显示出来了。 导读&#xff1a;MVP模式是MVC模式在…

Android MVP模式详解

一、MVP概述 MVP&#xff0c;全称 Model-View-Presenter&#xff0c;即模型-视图-层现器。 提到MVP&#xff0c;就必须要先介绍一下它的前辈MVC&#xff0c;因为MVP正是基于MVC的基础发展而来的。两个之间的关系也是源远流长。 MVC&#xff0c;全称Model-View-Controller&am…

浅谈安卓MVP模式

本篇博文通过对google官方demo&#xff1a;https://github.com/googlesamples/android-architecture/tree/todo-mvp/的理解&#xff0c;用自己的demo更好的讲解mvp的概念&#xff0c;帮助大家如何针对一个Activity页面去编写针对MVP风格的代码。 一、MVP模式介绍 随着UI创建技…

简单易懂 MVP 模式

Android MVP 模式 [1] 也不是什么新鲜的东西了&#xff0c;我在自己的项目里也普遍地使用了这个设计模式。当项目越来越庞大、复杂&#xff0c;参与的研发人员越来越多的时候&#xff0c;MVP 模式 的优势就充分显示出来了。 MVP 模式是 MVC 模式在 Android 上的一种变体&#…

深入浅出——MVP模式

由于公司里的架构模式用到MVP&#xff0c;觉得自己还不够熟悉&#xff0c;决定在此理一理&#xff0c;并给大家一起总结下。 一 MVP模式介绍 MVP全称Model View Presenter。 MVP能够有效的降低View的复杂性&#xff0c;避免业务逻辑被塞进View中&#xff0c;防止View的代码变…