iOS-组件化

1,557 阅读3分钟

1. 本地仓库制作

组件:基础组件,功能组件,业务组件,都可以制作成pod引用。

1.1. 创建文件

终端输入:pod lib create name,name是自己的组件名称。

1.2. 添加组件和需要引用的库

找到DeveLopment Pods文件夹,把自己组件制作的文件放在该文件下。这时候我们可以使用Example来测试组件是否能使用。如果该组件是不依赖第三方的,则不需要添加。

这里的RegexKitLite仅是在该Example测试。

这里的pod YaoChuFaKit 的path的位置就是组件的路径。

1.3. 组件放在项目使用

找到自己项目的Podfile文件,path的路径是相对路径,看自己放在哪里。如果组件依赖第三方库,就再pod依赖的库就行,不依赖就不用。运行即可。

 pod 'YaoChuFaKit', :path => '../LGLib/YaoChuFaKit'
  pod 'RegexKitLite'


2. 远程仓库制作

2.1. 修改.podspec文件

  • s.version:填写的是tag对应的版本号
  • s.summary:是简短说明
  • s.description:描述说明
  • s.homepage:首页路径
  • s.source:填写的是git路径,这个是远程仓库用到的路径
  • s.source_files:资源文件目录
  • s.dependency:依赖的第三方库

2.2. 远程仓库创建

创建远程私有仓库,例如码云,直接创建仓库就行。复制路径。

本地终端操作:

  • 终端:git add .
  • 终端:git commit -m '描述信息'
  • 终端:git remote add origin [gitee.com.\],添加远程分支
  • 终端:git push origin master,推送代码到远程仓库
  • 终端:git tag 0.1.0,添加本地标签,这个标签要和s.version一样。
  • 终端:git push --tags,推送所有本地标签到远程仓库。

2.3. 添加远程私有specs

我们自己曾经的要用到的私有组件,都可以统一放到自己的specs。

这个specs也是一个远程仓库。和2.2一样创建就行,名字可以自己随便命名,例如XXSpecs。

终端:pod repo add XXSpecs gitee.com/xxx/XXSpecs… repo add [仓库名称][仓库路径],把XXSpecs加入都本地的repo上。

这时候我们会发现本地就有XXSpecs文件了。

终端:pod lib lint --allow-warnings --use-libraries。校验.specs文件是否可以,这里我们去除警告,如果有问题会显示报错。这时候就要看错误说明了。

出现这种错误,主要还是看错误说明,正常是没有问题的,就看提交版本,和tag版本是否一致。

终端:pod repo push XXSpecs 本地的repo名.podspec --verbose --allow-warnings。还是要去除警告,不去除警告有可能会报上面的错误。

执行后,就可以到远程的XXSpecs上,看看组件是否用在该仓库上。然后我们就可以直接在自己项目上pod 组件库了。

3. CTMediator

组件化有多种方案可以操作,例如通过URL跳转方案,target-action方案,服务注册,通知广播等等,没有说哪种比较好,具体看业务实际需求,这里举例target-action分析,使用CTMediator。

github下载链接:github.com/casatwy/CTM…,直接下载源码简单分析。

Categories文件夹里面存放着CTMediator的分类,这个实际应用中也是一个单独的repo,由Actions负责,CTMediator+CTMediatorModuleAActions相当于仅提供对外暴露接口。

这里的分类,调用的是核心CTMediator文件的核心方法,这里的CTMediator相当于提供中间处理者。

进入方法后,target就会拼接为Target_A,actionString会拼接为Action_nativeFetchDetailViewController。

跑下去会走到系统的performSelector:withObject:方法。就变成 

[Target_A performSelector: Action_nativeFetchDetailViewController withObject: params]

这时候,我们就需要有Module来处理方法了,这个也是一个repo,里面放着业务层的信息,Target_A这个类里面的Action_nativeFetchDetailViewController方法就会返回我们详细控制器DemoModuleDtailViewController。此时整个路由就算是完成了。

可以明显看出,这样的好处是ViewController和DemoModuleADetailViewController是没有直接联系的,它们的路由是通过中间件CTMediator去协调的,耦合性降低了。

基本流程图就如上,谁的业务,谁就负责处理CTMediator_category,提供对外的方法即可。