组件化
背景
- 由于大厂业务繁多,开发过程中为了业务分块儿就拆分不同的业务组件;
- 随着业务迭代,可能有很多共性的东西,这些东西逐渐下沉为基础组件;
- 还有一些业务之间需要很多交互,那之间组件也很多沟通,需要解决组件之间交互问题。
- 这可以提高团队的开发效率以及单元测试
那么为了解决这些问题组件化就成了最合适的架构方案。模块间解耦、模块重⽤、提⾼团队协作、开发效率、单元测试等。
但是也有一些项目不需要组件化,对于这部分项目组件化反而是一种负担:
- 项⽬较⼩,模块间交互简单,耦合少
- 模块没有被多个外部模块引⽤,只是⼀个单独的⼩模块
- 模块不需要重⽤,代码也很少被修改
- 团队规模很⼩
大民哥带你玩转iOS组件化,其实很简单。
准备
cocoapod
管理工具- 安装cocoapod的朋友请移步 安装cocoapod
组件化原则
- 只能上层对下层依赖
- 项⽬公共代码资源 下沉
- 横向的依赖 最好下沉
- 组件建立接口(门面模式)(面向接口编程)
组件化分层
一般分:业务模块层,通用模块层(常用控件,数据管理,分享,三方SDK等),基础模块层(底层组件)
cocoaPod准备
探索
创建组件
pod lib create JDDSaaSFoundation
创建完成会是一个简单的项目工程。
导入依赖
导入三方依赖(git)
.podspec文件中导入
s.dependency 'MJExtension'
导入本地依赖
Podfile文件里面导入本地路径:
target 'ZMVideoPlayer_Example' do
pod 'ZMVideoPlayer', :path => '../'//表示当前文件路径在与Example同级的路径
pod 'MJExtension', :path => '../../MJExtension'//表示指定当前文件 在ZMVideoPlayer文件父级的路径
target 'ZMVideoPlayer_Tests' do
inherit! :search_paths
end
end
pod 'ZMVideoPlayer', :path => '../'//表示
资源文件导入
.podspec文件中导入,在调用的时候image指向相应组件库ZMVideoPlayer的bundle
s.resource_bundles = {
'ZMVideoPlayer' => ['ZMVideoPlayer/Assets/*.xcassets']
}
组件化解耦通信
解藕是为了解决,组件之间耦合以及通信的问题
路由解藕通信
通过引入Router,构建一个Url,比如:ZMRouter://块名/方法名?参数,然后加上成功回调,失败回调。
这种方式过于依赖组件命名,随着需求迭代,组件库废弃,或者命名与添加不一致,很容易找不到通信不便于维护
+ (void)openURL:(nonnull NSString*)url
param:(nullable NSDictionary*)param
resolve:(nullable ZMRouterResolveBlock)resolve
reject:(nullable JDDRouterRejectBlock)reject
{}
Mediator解藕通信
这种方式通过发送消息,给接收者,以传统的中介者管理为基础(Mediator),通过target去中心化,上浮业务功能action
以中介者设计方式封装了路由和本地,通过签名,消息慢速转发invocation响应Method(代表作:CTMediator,👍)
- 这种中央管理的方式,可以解决点对点的通信。
- 但随之也有一些问题,A与B通信,需要注册进Mediator一个分类,C与D通信同样也需要注册一个分类,对于大型项目,依赖度复杂的,可能两个业务库需要相互通信,以及存在一个库同时需要与多个库通信的,这种中央处理的方式就变得力不从心了
- 比如JD这种一个项目关联400+组件库的,依赖以及传输数据的多样性,Mediator的管理方式会导致管理中心比较臃肿了
BeeHive解藕通信
主要面向协议,protocol - class,使用代理分发事件,解决一对多的通信
- 首先派生AppDelegate类,模块注册,收集上下文环境,处理事件分发到Manager,由Manager通知各个模块同步事件,(代表作:BeeHive👍)
静态库
合并
经过我实践证明,Release版本下的真机和模拟器类型的静态库可以合并,当然Debug版本下的真机和模拟器类型的静态库也可以合并。但是,Release和Debug版本下的静态库不能互相合并
查看静态库设备支持类型:lipo -info 静态库路径
合并静态库:lipo -create 静态库1的路径 静态库2的路径 -output 要生成的静态库路径+静态库名称
使用
直接把生成的.a库拖到Xcode里面来,然后在Bulid Phases–>Link Binary With Libraries里面添加你的库
注意把头文件也导进来。