iOS 我的組件化日記 part4:真刀真槍

1.真實項目架構介紹

先看看結果把,再看看到達這個結果的一些坑.


基礎組件.png

根據原始項目的組成,外加效仿的MJG(頁面跳轉用路由+服務調用采取協議映射服務類)的方式切分出6個基礎組件:

KWBaseComponent  //包含常用分類+常用UI控件+宏的基本組件
KWProtocolMediatorComponent  //協議映射服務類中間件組件,內部就是KWProtocolMediator
KWRouterComponent  //路由組件,內部就是MGJRouter
KWConfigComponent  //配置文件組件
KWNetworkComponent  //網絡工具組件
KWMixAliComponent  //融合Ali推送的組件

然后又切分出若干個業務組件:

KWLoginComponent
KWMineComponent
KWHomeComponent
等等
殼工程>pods.png

回歸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關系.png
  • 組件小工程引用其他私有組件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實現組件化看文章是絕對不夠的,必須真刀真槍的干,自己去踩自己的坑.

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容