1.真實項目架構介紹
先看看結果把,再看看到達這個結果的一些坑.
根據原始項目的組成,外加效仿的MJG(頁面跳轉用路由+服務調用采取協議映射服務類)的方式切分出6個基礎組件:
KWBaseComponent //包含常用分類+常用UI控件+宏的基本組件
KWProtocolMediatorComponent //協議映射服務類中間件組件,內部就是KWProtocolMediator
KWRouterComponent //路由組件,內部就是MGJRouter
KWConfigComponent //配置文件組件
KWNetworkComponent //網絡工具組件
KWMixAliComponent //融合Ali推送的組件
然后又切分出若干個業務組件:
KWLoginComponent
KWMineComponent
KWHomeComponent
等等
回歸part1:練嘴
中所說的App組件化專注的問題
App組件化專注于兩個問題:
1.各個頁面之間的跳轉問題. ==> KWRouterComponent(MGJRouter)
2.各個組件之間相互調用. ==> KWProtocolMediatorComponent(KWProtocolMediator)
2.制作pod沒那么簡單
在part3:演習
中,我們所寫的制作pod的工程并不引用私有pod.但在真實pod實現組件化的時候是沒那么簡單了.
2.1 組件小工程角度
在寫業務組件1小工程
的時候用到基礎組件
,也就是說業務組件1小工程
內要用到基礎組件的pod
.
在寫業務組件1小工程
的用到業務組件2
的內容,也就是說業務組件1的小工程
內要用到組件2的pod
.
不是說好組件間不相互引用代碼嗎?[不相互引用]指的是[不直接引用]!組件間肯定存在著存在千絲萬縷的關系,而這種關系用了pod做包裝,實現了代碼的物理隔斷.
- 組件小工程引用其他私有組件pod注意點1
還記得podspec文件內部的s.dependency
字段嗎?
s.dependency 'Masonry'
用到公有庫要寫,用到私有庫也要寫哦!
比如KWMineComponent
用到了公有庫Masonry
,也用到了私有庫KWLoginComponent
.那么s.dependency
字段就要寫作:
s.dependency 'Masonry'
s.dependency 'KWLoginComponent'
- 組件小工程引用其他私有組件pod注意點2
還記得前文part3:演習
==>step4.1:校驗
的命令pod lib lint
?
組件1小工程
引用組件2的pod
,組件1小工程
本身也要做pod的校驗
,命令行就沒有那么簡單了!
pod lib lint --sources='https://git.oschina.net/pogongzhang/PGSpecs.git,https://github.com/CocoaPods/Specs' --allow-warnings --verbose --use-libraries
pod lib lint
后加上:
1.私有pod
所在私有pod倉庫的地址
==>https://git.oschina.net/pogongzhang/PGSpecs.git
2.公有庫地址
==>https://github.com/CocoaPods/Specs
--allow-warnings
--verbose
--use-libraries
這3句看情況加
2.2 殼工程角度
再看pod關系.png
,從殼工程(mainworkspace
)的角度看就是:你們背后是什么勾當,我不管.在我這,都是一級扁平化管理.
3.pod實現組件化 特有的具體的坑
3.1 組件小工程就不用寫pch文件
日常開發中我們會將一些常用的宏,分類,類的頭文件放在pch內,好全局一起用.現在寫組件小工程就不用.因為校驗時是只看貢獻代碼的,不會讀pch的.如果你寫了pch,并用到了pch的內容,校驗時會報各種頭文件找不到.
3.2 各種import頭文件
因為不能寫pch文件,所以要各種import頭文件.
3.3 加載pod貢獻的資源
前面已經講過,pod內的圖片
,xib
,storyboard
等資源文件必須要特別注意在podspec文件
內路徑的配置.當然用到這些資源時,也是有要注意的地方.因為原始的開發方式,所有代碼與資源都放在[NSBundle mainBundle]
內,而pod實現組件化的時候各個pod會有自己的Bundle
.
- 加載xib
原始開發加載xib
NSArray * nibs = [[NSBundle mainBundle]loadNibNamed:@"AnyInputView"owner:nil options:nil];
AnyInputView * inputView = [nibs objectAtIndex:0];
pod實現組件化加載pod內xib
NSArray * nibs = [[NSBundle bundleForClass:[加載資源的當前類]] loadNibNamed:@"AnyInputView"owner:nil options:nil];
AnyInputView * inputView = [nibs objectAtIndex:0];
- 加載圖片
原始開發加載圖片
UIImage * image = [UIImage imageNamed:@"any"];
pod實現組件化加載pod內圖片
CGFloat scale_screen = [UIScreen mainScreen].scale;
NSString * path = nil;
NSString * name = @"any";
Class curClass = [加載資源的當前類];
if (scale_screen > 2.0){
NSString * fullname = [NSString stringWithFormat:@"%@@3x", name];
path = [[NSBundle bundleForClass:curClass] pathForResource:fullname ofType:@"png"];
}else{
NSString * fullname = [NSString stringWithFormat:@"%@@2x", name];
path = [[NSBundle bundleForClass:curClass] pathForResource:fullname ofType:@"png"];
}
UIImage * image = [UIImage imageWithContentsOfFile:path];
真刀真槍用pod實現組件化的時候會有各種坑,這里只列出了印象最深的.當然要掌握pod實現組件化看文章是絕對不夠的,必須真刀真槍的干,自己去踩自己的坑.