iOS Viper架构(中文版)【看懂这篇就够了】

完整源码地址

一、iOS_Viper

iOS的Viper架构,作为一个从业多年的iOS开发者,我个人认为应该要会一点viper
在这里插入图片描述

二、前言

  1. viper的设计模式在iOS开发中不流行,甚至是Swift中,也没有用,我认为比较可惜。
  2. 作为iOSer,当你掌握了viper,在设计模式上,你能超越90%的同行了。
  3. viper理解起来需要一点时间成本,但是我希望你能静下心来,花一点时间理解它,在较大的时间项目中。
  4. 使用它:
    1. 前期架构搭建耗时,相比mvc,mvvm, mvp等设计模式会增加约2天工作日左右。
    2. 但是后期随着业务的发展以及维护,会降低50%维护成本(长期看是节省时间,提升效率,减少加班)

三、架构图

请添加图片描述

3.1 分析架构图

  1. 我们写代码中最怕的是什么?业务耦合度高!此架构最大的优势,就是帮助我们把业务解耦,同时带来最大的劣势就是使用成本高。因此需要根据项目来选择是否使用viper,而不是盲目推崇viper
  2. 我们从上往下看,我们可以把view理解为一个组织中最高领导者。
  3. view的功能,只处理UI相关的逻辑,例如刷新UI,添加弹窗,展示loading等。
    1. view是作为presenter的直接领导,所以view强引用presenter
    2. presenter给view汇报工作,需要谦卑一点(没见过给领导汇报工作还十分嚣张的吧),我们这里其实是为了防止循环引用
  4. presenter作为这个组织架构中的中层管理者,是最累的角色(实际工作中,中层领导也是最累的)
    1. presenter对上级view需要汇报工作
    2. presenter对下级interactor需要指导工作
    3. presenter对助手router需要指导工作
  5. router的角色,是辅助presenter做一些页面跳转的相关工作
  6. interactor作为交互逻辑专职部门,主要工作是主导交互的数据处理,它的下级是entity
  7. entity是底层干活的兄弟们(有没有被戳中?)
    1. interactor指导entity工作(强引用)
    2. entity给interactor汇报工作(弱引用)

3.2 延展分析

  1. 对于entity,我们其实可以理解为数据处理层,在实际的较为复杂的业务场景中,可以参照如下模式,对entity进行进一步细分
    请添加图片描述

四、代码解析

  1. Swift提倡的是面向协议编程,我们把这5个模块都定义成协议
    请添加图片描述

  2. 对viewProtocols的分析

    1. 可以看到,viewProtocols是为view服务的,列举了4个常见的方法,刷新视图,展示loading,展示错误,隐藏loading
  3. 对presenterProtocols的分析
    请添加图片描述

    1. presenter 需要持有view,实现的时候要注意使用弱引用
    2. viewDidLoad方法,是在view需要主动调用的
    3. presenter 需要持有router,这里因为是单方面引用,所以需要用强引用
    4. presenter 需要持有interactor,因为是上级,所以强引用
    5. didInteractorRetrieveData方法,顾名思义,就是interactor给presenter的回调方法
  4. 对routerProtocls
    请添加图片描述

    1. createTabBarVC方法,就是一个静态方法,在appdelegate启动后,创建根视图所用的
    2. addChildViewController就是给UINavigationController提供一个初始化vc的方法,这里的vc,就是我们架构中的view层
    3. pushToNextVC方法不用过多解释了,就跳转带参数方法
  5. 对interactorProtocols的分析
    请添加图片描述

    1. interactor需要弱引用上级presenter
    2. 提供一个给presenter主动调用的方法,interactorRetrieveData
    3. interactor强持有下级entity
    4. didEntityReceiveData就是entity的数据回调方法
  6. 对EntityProtocols的分析
    请添加图片描述

    1. entity弱引用上级interactor
    2. retrieveData是给interactor主动调用的方法
    3. didReceiveData是回调方法

五、实际业务代码目录分级

  1. 上面是为了详细分析,从而把代码分多个文件夹,实际项目中,根据业务情况,可以简单这样划分即可。
    请添加图片描述

这样分级,结构清晰,又不会显得太冗余

六、代码打印分析

请添加图片描述

调用顺序以及回调顺序,和我们的架构图是保持一致的。

完整源码地址

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/55293.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2023年第四届“华数杯”数学建模思路 - 案例:随机森林

## 0 赛题思路 (赛题出来以后第一时间在CSDN分享) https://blog.csdn.net/dc_sinor?typeblog 1 什么是随机森林? 随机森林属于 集成学习 中的 Bagging(Bootstrap AGgregation 的简称) 方法。如果用图来表示他们之…

electron+vue+ts窗口间通信

文章目录 一. 目的二.逻辑分析三. 代码示例 "types/node": "^20.3.1","vitejs/plugin-vue": "^4.1.0","vueuse/electron": "^10.2.1","electron": "^25.2.0","electron-packager":…

激荡十三年,消费金融进入“体验争夺战”的下半场

消费金融行业又开始涌动着变局。 先是一些老玩家悬着的心,终于落地。过去两年,消费金融是蚂蚁集团整改的关键板块。前不久,蚂蚁集团被监管部门开出71.23亿元的“罚单”,市场普遍认为这是利空出尽的信号。 与此同时,竞…

EventBus 开源库学习(三)

源码细节阅读 上一节根据EventBus的使用流程把实现源码大体梳理了一遍,因为精力有限,所以看源码都是根据实现过程把基本流程看下,中间实现细节先忽略,否则越看越深不容易把握大体思路,这节把一些细节的部分再看看。 …

OA办公自动化系统设计与实现(论文+源码)_kaic

摘要 随着信息化建设的日益深入,无论是政府还是企事业单位,部门之间的信息沟通与协调工作越来越重要。人们迫切需要一个能充分利用网络优势,并可以管理企业的各种重要信息的软件平台,利用该平台快速建立自己的信息网络和办公管理系…

C语言案例 按序输出多个整数-03

难度2复杂度3 题目:输入多个整数,按从小到大的顺序输出 步骤一:定义程序的目标 编写一个C程序,随机输入整数,按照从小到大的顺序输出 步骤二:程序设计 整个C程序由三大模块组成,第一个模块使…

利用XSS在线平台获取用户cookie

//XSS弹窗&#xff1a; <script>alert("xss")</script> XSS漏洞&#xff1a; //XSS弹窗&#xff1a; <script>alert("xss")</script> //XSS在线平台&#xff1a; <ScRipT sRc//7ix7kigpovxdbtd32fuspgffmtmufo3wwzgnzaltddewtb…

应急响应-勒索病毒的处理思路

0x00 关于勒索病毒的描述 勒索病毒入侵方式&#xff1a;服务弱口令&#xff0c;未授权&#xff0c;邮件钓鱼&#xff0c;程序木马植入&#xff0c;系统漏洞等 勒索病毒的危害&#xff1a;主机文件被加密&#xff0c;且几乎难以解密&#xff0c;对主机上的文件信息以及重要资产…

C# PaddleDetection 版面分析

效果 项目 代码 using OpenCvSharp; using OpenCvSharp.Extensions; using Sdcb.PaddleDetection; using Sdcb.PaddleInference; using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Lin…

2023-08-06 LeetCode每日一题(24. 两两交换链表中的节点)

2023-08-06每日一题 一、题目编号 24. 两两交换链表中的节点二、题目链接 点击跳转到题目位置 三、题目描述 给你一个链表&#xff0c;两两交换其中相邻的节点&#xff0c;并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题&#xff08;即&#xff0…

ffmpeg-ffplay代码架构简述

全局变量 /* Minimum SDL audio buffer size, in samples. */ // 最小音频缓冲 #define SDL_AUDIO_MIN_BUFFER_SIZE 512 /* Calculate actual buffer size keeping in mind not cause too frequent audio callbacks */ // 计算实际音频缓冲大小&#xff0c;并不需要太频繁…

2023年8月初补题

看这个人的专栏 https://blog.csdn.net/qq_42555009/category_8770183.html 有一定思维难度&#xff0c;贪心&#xff0c;用multiset实现 翻译&#xff1a; 链接&#xff1a;https://ac.nowcoder.com/acm/contest/33187/H 来源&#xff1a;牛客网 在夜之城的中心有一座高大…