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,提供对外的方法即可。