iOS开发—深入探索组件化
1.组件化的分层
组件化分层的意义:
- 1.模块间解耦合
- 2.模块重用
- 3.提高开发的效率
组件的颗粒度划分如下:(注意:必须是上层依赖下层,不可以平行层之间互相依赖,如果平行层之间有依赖的必要性,那么应该把公共的部分,下沉到下一个层次,再进行依赖)

2.cocoapod的补充知识
当我们的项目用cocoapod进行三方库的管理时候,我们的项目下层依赖就会cocoapod,那么我们的项目是怎样查找到需要使用的三方库(比如AFNetWorking)呢?,如下图,我们cocoapod的本地库中,在master/specs下后面的0/a里面放着我们来下的的三方的一些信息和索引,当我们需要目标三方库的时候我们specs下子目录中进行匹配,找到响应的三方库的链接,跳转github进行下拉到本地供我们使用。因为我们组件化也是使用cocoapod进行管理的,所以这里建党讲解一下使用原理。
3.组件化的基本操作(注意:记得每次对组件进行改动后,我们在项目中打开查看都需要pod install 更新刚才修改的操作)
1.组件化的基本操作
在我们的电脑上新建一个目录:比如我新建---组件化,然后我们比如要写一个宏定义和分类的组件(我的这组件命名:LGMacroAndCategoryModule),在终端中cd 到我们要新建组件的目录下,写命令 pod lib create 组件名,然后终端就会从github下拉一个组件化的模版当当前的目录下,之后命令提示入下图跟着敲写即可,新建成功会running出这个新建项目来。

我们关闭刚才新建成功后running出来的项目,如下图打开其目录,在class中放入我们组件化的代码文件。
在刚才目录中example下,在终端cd 到此目录下,我们执行pod install 命令后,我们在example下打开项目,我们就可以看到刚才的组件化文件,就显示出来了。

如下图文件是我们刚才新建的组件的信息存在podfile中。
2.组件化之间的依赖
如上步骤1中,我们新建另一个组件,让后依赖上一个组件后,如下图我当在新建的组件中配置一些依赖信息操作,才能运行和使用。

3.组件化的资源文件
3.1图片资源
当我们组件中需要用到一些图片资源,我们怎么把图片资源放在组件中呢,比如我们组件就是在一个viewcontroller中用一个imageView显示一张图片,在我们刚才放代码的同级目录有一个Assets,我们可以把我们的图片资源放在这个目录下,如下图
我们运行过后,发现图片还是没有加载出来,所以我们就无法直接使用imageWithName去加载图片了,我们需要修改一下获取图片资源的路径,如下图,我们通过bundle中获取刚才放进去的图片进行显示。
当然我们还需要在如下的项目中,对资源的路径进行配置,记得修改完成后进行pod install。
3.2josn文件资源
当我们的项目需要导入json文件时,放在如下图所示的目录中。
然后在使用到josn文件的代码中,进行如下图所示的路径配置。
3.3xib文件资源
当我们的项目中有xib文件的时候,也需要如下图,对获取路径进行修改配置。
4.组件间的通讯
当前大家普遍使用通讯方式有3种,CTMediator,阿里开发的BeeHive,还有路由通讯方式。
4.1CTM通讯(建议大家感兴趣的可以自行下载CTMediator进行研究学习)
模块之间的通讯需要借助中间层,CTM层,A B 2个控制器见通讯时候需借助CTM层,通讯需要传递一些参数,也在CTM中,需要接受这+消息体,也就target action params,
我们在中间层为什么使用签名的方式和invocation,因为这样可以直接对参数进行invocation的赋值,而使用 target perform方法只能对对象操作而且也无法直接赋值还要进行间接操作,比较麻烦。
我们通常不会直接使用CTM,在CTM 到目标控制器之间我们还会,给目标控制器分离出一个action的业务层,进行业务和数据操作,同时我们也不会直接使用ctm我们像对afn的二次封装一样,防止以后CTM跟新后对整个项目的影响,我对CTM新建出一个分类进行这样的隔离,如下图中所示。我们模块和控制器之间的通讯我们使用CTM action的分类进行的。这个分类我为了便捷使用我们一般也会做成组件来使用。
4.2 BeeHive通讯
BeeHive 是点对多的组件化通讯,我们使用appdelegate中很多功能会在其他页面中用到,appdelegate 重要的方法,allication didfinsh中我们需要对参数application 和 launchoption 进行保存,appdelegate没有主动下发的能力,我们需要建立manager接受appdelegate的功能,对其主动下发,需要用context对其参数进行保存,Mprotocal是业务消费层。
保存信息:
管理者主动下发:
MProtocol 事件具体处理 消费层
在具体的模块功能层,遵循协议 具有使用协议功能的权利
A控制器中的内容无法获取,class目标层也无法获取,我们通过中间层manager层进行通讯。我们A中protocol层暴露出来的service中者所需的action,target,protocol和目标class是绑定的,可以通过动态内存中获取也可以静态的文件中获取。
从接口层拿到vc 进行通讯
动态获取,缓存里面建立的绑定 拿出来的
上面是拿,现在是存,
通过mach-o 文件中 获取data数据段 和section中动态获取,想要详细了解这块需要具备底层的基础。
结语:
组件化的探索就到这里了,希望和各位大佬小白守望互进,如果对各位看官老爷有点帮助的话,可以多多点赞啊。
推荐👇:
- 020 持续更新,精品小圈子每日都有新内容,干货浓度极高。
- 结实人脉、讨论技术 你想要的这里都有!
- 抢先入群,跑赢同龄人!(入群无需任何费用)
(直接搜索群号:789143298,快速入群)
点击此处,与iOS开发大牛一起交流学习
申请即送:
- BAT大厂面试题、独家面试工具包,
- 资料免费领取,包括 数据结构、底层进阶、图形视觉、音视频、架构设计、逆向安防、RxSwift、flutter,
没有评论:
发表评论