為什么要組件化?
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