为什么要组件化?
1.解决人多(更好的协作)、需求多(更好的功能模块划分)的问题
2.解决项目模块间的代码耦合问题;(坚决抵制业务组件间代码直接引用)
3.方便进行单元测试(每个模块就是一个单元)
4.采用cocoapods引用,能够快速的进行版本切换
5.创建新项目时,能够更快速的搭建
组件化结构
组件集成
组件化的构建
1.中间层采用LDBusMediator
2.组件间跳转采用openUrl的形式
例:需要打开ADetail视图控制器,传递参数为image,present的形式打开
if([LDBusMediatorcanRouteURL:[NSURLURLWithString:@"productScheme://ADetail"]]){
[LDBusMediatorrouteURL:[NSURLURLWithString:@"productScheme://ADetail"]
withParameters:
@{@"image":@"",
kLDRouteModeKey:@(NavigationModePresent)}
];
}
3.组件间获取数据、调用方法采用协议的形式
例:调用moduleA_deliveAprotocolModel方法,获取到item1
id item1 =
[[LDBusMediatorserviceForProtocol:@protocol(ModuleAXXXServicePrt)]moduleA_deliveAprotocolModel:item2];
ModuleAXXXServicePrt协议为
-(id)moduleA_deliveAprotocolModel:(id)item
ModuleAXXXItemPrt协议为
@protocolModuleAXXXItemPrt
@required
@property(nonatomic,readwrite)NSString*__nonnullitemName;
@property(nonatomic,readwrite)intitemAge;
-(nonnullNSString*)description;
@optional
-(nonnullinstancetype)initWithItemName:(nonnullNSString*)itemName itemAge:(int)itemAge;
@end
4.组件间的实现
a)所有的组件都以来于LDBusMediator
b)中间件会为每个组件提供两个协议,所有的协议也可以单独成立为一个组件
该组件需为外部提供的方法
该组件需为外部提供的数据
c)每个组件实现两个协议
为外部组件提供的方法
为外部组件提供的数据
如何创建cocoapods
1.初始化pod仓库,使用命令行$ pod lib create XXXX
2.输入完命令会问你几个问题,具体如下:
邮箱
选择语言?objc
是否需要demo?yes
选择一个测试框架?none
是否基于uiview测试?no
demo类的前缀?XXX
3.输入完以上信息,会生成以下文件
Example(demo和pod信息在此文件夹下)
README.md(说明文件)
XXXX. podspec(pod库配置信息)
Pod(类文件、资源文件)
其他略
4.编辑XXXX.podspec
Pod::Spec.new do |s|
s.name= 'xxxx'
s.version= '0.1.0'
s.summary= 'A shortdescription of xxxxx.'
s.description= <<-DESC
TODO: Add long description of the pod here.
DESC
s.homepage='https://127.0.0.1/svn/xxxx/trunk/xxxx'
s.license= { :type => 'MIT', :file =>'LICENSE' }
s.source= { :svn =>'https://127.0.0.1/svn/xxxx/trunk/xxxx' }#配置svn地址
s.ios.deployment_target = '8.0'
s.source_files = 'xxxx/**/*'#类文件路径
s.public_header_files = ''#公开头文件引用
#s.prefix_header_contents = ''#预编译文件名
s.resources = 'xxxx/xxxxx.bundle'#资源文件(xib、图片等)必须放到bundle下
s.frameworks = 'UIKit'#需要引用的类库,可不写
s.dependency 'SVProgressHUD'#依赖类库,可以指定版本,不指定默认为最新
s.dependency 'LDBusMediatorLibrary'#依赖中间层,必须写。同时Podfile里必须引入该库,否则会报错
end
“*”表示匹配所有文件
“*.{h,m}”表示匹配所有以.h和.m结尾的文件
“**”表示匹配所有子目录
此处为子空间,可以分开导入不同的pods仓库
s.subspec 'NetWorkEngine' do |networkEngine|
networkEngine.source_files ='Pod/Classes/NetworkEngine/**/*'
networkEngine.public_header_files ='Pod/Classes/NetworkEngine/**/*.h'
networkEngine.dependency 'AFNetworking','~> 2.3'
networkEngine.resource= "Pod/Assets/MLSUIKitResource.bundle"
end
5.验证
a)正常项目在命令行输入pod spec lint验证,当提示如下,则通过验证
->XXXX(0.1.0)
XXXX passed validation
b)xcode8报错
ERROR | [iOS]unknown: Encountered an unknown error (Must be in the root of the repo(/Users/zhouhuanqiang/.cocoapods/repos/master), instead in/Users/zhouhuanqiang/Desktop/IM.) during validation.
原因是xcode8路径改了,执行以下命令即可解决
sudo xcode-select -switch/Applications/Xcode.app/Contents/Developer
c)因为我们的项目需要依赖私有库,需输入pod lib lint --quick --allow-warnings命令来通过验证
6.更新pod开发
a)进入Example文件夹,执行pod install便可进行Demo编写
b)关于依赖库,所以Podfile文件里应加入以下配置信息
#正式
pod'LDBusMediatorLibrary',
:svn =>'https://127.0.0.1/svn/xxxx/',:tag =>"modules/LDBusMediatorLibrary/0.1.2"
#测试
#pod 'LDBusMediatorLibrary', :svn=>'https://127.0.0.1/svn/xxxx/trunk/modules/LDBusMediatorLibrary'
7.添加到tags版本下
代码提交后,使用命令行来打tags
svn copy主干路径 tags路径–m “说明”
8打包成.a文件和framework
http://www.cnblogs.com/brycezhang/p/4117180.html
网友评论