iOS 组件化

514 阅读6分钟

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中动态获取,想要详细了解这块需要具备底层的基础。

结语:

组件化的探索就到这里了,希望和各位大佬小白守望互进,如果对各位看官老爷有点帮助的话,可以多多点赞啊。