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