為什么要組件化?
1.解決人多(更好的協(xié)作)物赶、需求多(更好的功能模塊劃分)的問題
2.解決項(xiàng)目模塊間的代碼耦合問題;(堅(jiān)決抵制業(yè)務(wù)組件間代碼直接引用)
3.方便進(jìn)行單元測試(每個(gè)模塊就是一個(gè)單元)
4.采用cocoapods引用务热,能夠快速的進(jìn)行版本切換
5.創(chuàng)建新項(xiàng)目時(shí),能夠更快速的搭建
組件化結(jié)構(gòu)
組件集成
組件化的構(gòu)建
1.中間層采用LDBusMediator
2.組件間跳轉(zhuǎn)采用openUrl的形式
例:需要打開ADetail視圖控制器际看,傳遞參數(shù)為image生均,present的形式打開
if([LDBusMediatorcanRouteURL:[NSURLURLWithString:@"productScheme://ADetail"]]){
[LDBusMediatorrouteURL:[NSURLURLWithString:@"productScheme://ADetail"]
withParameters:
@{@"image":@"",
kLDRouteModeKey:@(NavigationModePresent)}
];
}
3.組件間獲取數(shù)據(jù)、調(diào)用方法采用協(xié)議的形式
例:調(diào)用moduleA_deliveAprotocolModel方法邦马,獲取到item1
id item1 =
[[LDBusMediatorserviceForProtocol:@protocol(ModuleAXXXServicePrt)]moduleA_deliveAprotocolModel:item2];
ModuleAXXXServicePrt協(xié)議為
-(id)moduleA_deliveAprotocolModel:(id)item
ModuleAXXXItemPrt協(xié)議為
@protocolModuleAXXXItemPrt
@required
@property(nonatomic,readwrite)NSString*__nonnullitemName;
@property(nonatomic,readwrite)intitemAge;
-(nonnullNSString*)description;
@optional
-(nonnullinstancetype)initWithItemName:(nonnullNSString*)itemName itemAge:(int)itemAge;
@end
4.組件間的實(shí)現(xiàn)
a)所有的組件都以來于LDBusMediator
b)中間件會為每個(gè)組件提供兩個(gè)協(xié)議贱鼻,所有的協(xié)議也可以單獨(dú)成立為一個(gè)組件
該組件需為外部提供的方法
該組件需為外部提供的數(shù)據(jù)
c)每個(gè)組件實(shí)現(xiàn)兩個(gè)協(xié)議
為外部組件提供的方法
為外部組件提供的數(shù)據(jù)
如何創(chuàng)建cocoapods
1.初始化pod倉庫宴卖,使用命令行$?pod?lib?create?XXXX
2.輸入完命令會問你幾個(gè)問題,具體如下:
郵箱
選擇語言邻悬?objc
是否需要demo?yes
選擇一個(gè)測試框架症昏?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 = ''#預(yù)編譯文件名
s.resources = 'xxxx/xxxxx.bundle'#資源文件(xib、圖片等)必須放到bundle下
s.frameworks = 'UIKit'#需要引用的類庫蛾扇,可不寫
s.dependency 'SVProgressHUD'#依賴類庫攘烛,可以指定版本,不指定默認(rèn)為最新
s.dependency 'LDBusMediatorLibrary'#依賴中間層镀首,必須寫坟漱。同時(shí)Podfile里必須引入該庫,否則會報(bào)錯(cuò)
end
“*”表示匹配所有文件
“*.{h,m}”表示匹配所有以.h和.m結(jié)尾的文件
“**”表示匹配所有子目錄
此處為子空間更哄,可以分開導(dǎo)入不同的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.驗(yàn)證
a)正常項(xiàng)目在命令行輸入pod spec lint驗(yàn)證芋齿,當(dāng)提示如下,則通過驗(yàn)證
->XXXX(0.1.0)
XXXX passed validation
b)xcode8報(bào)錯(cuò)
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路徑改了成翩,執(zhí)行以下命令即可解決
sudo xcode-select -switch/Applications/Xcode.app/Contents/Developer
c)因?yàn)槲覀兊捻?xiàng)目需要依賴私有庫觅捆,需輸入pod lib lint --quick --allow-warnings命令來通過驗(yàn)證
6.更新pod開發(fā)
a)進(jìn)入Example文件夾,執(zhí)行pod install便可進(jìn)行Demo編寫
b)關(guān)于依賴庫麻敌,所以Podfile文件里應(yīng)加入以下配置信息
#正式
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
參考文件
iOS組件化實(shí)踐方案-LDBusMediator煉就