基础工具类组件:基础工具类是各个互相独立,没有任何依赖的工具组件。它们和其它的工具组件、业务组件等没有任何依赖关系。这类组件例如有:对数组,字典进行异常保护的Safe组件,对数组功能进行扩展Array组件,对字符串进行加密处理的加密组件等等。
中间件组件:这个组件比较特殊,这个是我们为了实现组件化开发而衍生出来的一个组件,上面示例图中的中间调度者就是一个功能独立的中间件组件。
基础UI组件:视图组件就比较常见了,例如我们封装的导航栏组件,Modal弹框组件,PickerView组件等。
业务工具组件:这类组件是为各个业务组件提供基础功能的组件。这类组件可能会依赖到其他的组件。例如:网络请求组件,图片缓存组件,jspatch组件等等
至于组件的拆分颗粒度,这个着实不好去断定,因人而异,不同的需求功能复杂度拆分出来的组件大小也不尽相同
如何从零到一搭建组件化架构在讲如何从零到一来实现一个组件化架构项目前,我们需要熟练掌握使用pod来制作组件库。下面我们就围绕提供的组件化示例项目来展开讲解。
首先,我们来看示例Demo中包含哪些业务组件(如下图所示:):
示例Demo中,我提供了三个业务组件来作为演示效果,其中业务模块A和业务模块B是临时业务模块组件,电子发票业务组件时真实的企业需求功能组件。
我们再来看下示例Demo中都提供了哪些工具组件(如下图所示)
注意了:这里提供的6个工具组件也都是作者已经封装好的功能组件,大家也可以直接 install 安装使用的哦。
详细操作步骤
第一步:
我们先创建一个空的iOS工程项目:MainProject,这个空项目作为我们的主工程项目,就是上面所说的壳子工程项目,然后初始化pod,这里不清楚pod的使用的小伙伴们请自行查阅资料。
第二步:
我们创建一个空工程项目:ModuleA,这个ModuleA 项目作为我们的业务A组件。然后我们初始化pod,初始化podspec文件。
第三步:
我们创建一个空工程项目:ModuleB,这个ModuleB 项目作为我们的业务B组件。然后我们初始化pod,初始化podspec文件。
第四步:
我们创建一个空工程项目:ComponentMiddleware,这个项目就是我们上面所说的中间调度者。然后我们初始化pod,初始化podspec文件。
第五步:
我们创建一个空工程项目: ModuleACategory,这个工程是对应业务组件A的一个分类工程。然后我们初始化pod,初始化podspec文件。
第六步:
我们创建一个空工程项目: ModuleBCategory,这个工程是对应业务组件B的一个分类工程。然后我们初始化pod,初始化podspec文件。
好了,上面的主工程和两个业务组件工程,以及两个组件分类工程都已创建完毕,下面我们来讲解他们各个之间如何工作的。我就从主工程加载业务组件开始往下捋,顺藤摸瓜式的引出每个工程的用意。
第七步:
我们在主工程MainProject的Podfile中引入我们的业务组件B工程ModuleB,以及引入我们的ModuleB的分类工程:ModuleBCategory。然后我们pod install。这时已将这两个组件库引入到我们的主工程中了。
示例代码如下:
# Uncomment the next line to define a global platform for your project platform :ios, '8.0' source 'https://github.com/CocoaPods/Specs.git' source 'https://github.com/guangqiang-liu/GQSpec.git' target 'GQComponentDemo' do pod 'ModuleB' pod 'ModuleBCategory' end然后我们在主工程中添加一个按钮事件,这个事件是点击 push 到业务组件B的 页面。
示例代码如下:
#import <ModuleBCategory/ComponentScheduler+ModuleB.h> - (void)moduleB { UIViewController *VC = [[ComponentScheduler sharedInstance] ModuleB_viewControllerWithCallback:^(NSString *result) { NSLog(@"resultB: --- %@", result); }]; [self.navigationController pushViewController:VC animated:YES]; }第八步:
上面第七步中,我们用到了ModuleBCategory 这个分类工程。这个工程我们只对外暴露了两个文件。这两文件是上面的中间调度者的分类,也就是说是中间件的分类。我们先来看下这个分类文件的.h 和.m 实现。
.h
#import "ComponentScheduler.h" @interface ComponentScheduler (ModuleB) - (UIViewController *)ModuleB_viewControllerWithCallback:(void(^)(NSString *result))callback; @end