資料介紹
軟件簡(jiǎn)介
TinyPart 是一個(gè)由 Objective-C 編寫的面向協(xié)議的 iOS 模塊化框架,同時(shí)它還支持 URL 路由和模塊間通信機(jī)制。
安裝
cocoapods
pod 'TinyPart'
特點(diǎn)
- 面向協(xié)議。TinyPart中模塊和服務(wù)都是面向協(xié)議的。服務(wù)面向協(xié)議的好處在于對(duì)于接口維護(hù)比較友好,任何接口的變動(dòng)在編譯時(shí)都是可見的,但是大型項(xiàng)目有可能會(huì)面臨大量需要維護(hù)的協(xié)議,這也是不可忽視的缺點(diǎn)。
- 動(dòng)態(tài)化。TinyPart中模塊和服務(wù)的注冊(cè)都是在運(yùn)行時(shí)完成的,可以根據(jù)具體需要調(diào)整模塊的注冊(cè)和啟動(dòng)時(shí)間,異步啟動(dòng)模塊對(duì)于優(yōu)化APP首屏加載時(shí)間會(huì)有幫助。
- 路由服務(wù)。我們知道面向協(xié)議的服務(wù)雖然對(duì)于接口維護(hù)比較方便,但是模塊間相互調(diào)用各自服務(wù),是需要知道對(duì)方協(xié)議的,這樣最后可能會(huì)導(dǎo)致所有的協(xié)議需要暴露給所有的模塊。比如現(xiàn)在有10個(gè)模塊每個(gè)模塊有1個(gè)服務(wù)協(xié)議,在上述情況下每個(gè)模塊需要知道另外9個(gè)模塊的協(xié)議,這相當(dāng)于每個(gè)協(xié)議都被@import了9次,所有協(xié)議總共將會(huì)被@import 9*10=90次,這對(duì)于想做完全代碼隔離的模塊化來(lái)說(shuō)是個(gè)噩夢(mèng)。通過(guò)路由服務(wù)則很好地平衡了模塊間調(diào)用和依賴問(wèn)題,順便也解決了跨APP跳轉(zhuǎn)的問(wèn)題。
- URL路由。在路由基礎(chǔ)上,只需要再增加簡(jiǎn)單的1到2行代碼就可以實(shí)現(xiàn)通過(guò)APPScheme的URL路由機(jī)制。
-
多級(jí)模塊有向通信。一般來(lái)說(shuō),完全去耦合的模塊間通信方案大概是兩種:URL和通知
NSNotification
。URL解決了模塊間服務(wù)相互調(diào)用的問(wèn)題,但是如果想要通過(guò)URL實(shí)現(xiàn)一個(gè)觀察者模式則會(huì)變得非常復(fù)雜。這時(shí)候大家可能會(huì)偏向于選擇通知,但是由于通知是全局性的,這樣會(huì)導(dǎo)致任何一條通知可能會(huì)被APP內(nèi)任何一個(gè)模塊所使用,久而久之這些通知會(huì)變得難以維護(hù)。 所謂多級(jí)模塊有向通信,則是在NSNotification
基礎(chǔ)上對(duì)通知的傳播方向進(jìn)行了限制,底層模塊對(duì)上層模塊的通知稱為廣播Broadcast
,上層模塊對(duì)底層模塊或者同層模塊的通知稱為上報(bào)Report
。這樣做有兩個(gè)好處:一方面更利于通知的維護(hù),另一方面可以幫助我們劃分模塊層級(jí),如果我們發(fā)現(xiàn)有一個(gè)模塊需要向多個(gè)同級(jí)模塊進(jìn)行Report
那么這個(gè)模塊很有可能應(yīng)該被劃分到更底層的模塊。
架構(gòu)說(shuō)明
用法
初始化
- 繼承 TPAppDelegate,初始化TPContext
#import "TinyPart.h" @interface AppDelegate : TPAppDelegate @property (strong, nonatomic) UIWindow *window; @end @implementation AppDelegate @synthesize window; - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { [TPMediator sharedInstance].deleagate = self; [TPContext sharedContext].launchOptions = launchOptions; [TPContext sharedContext].application = application; context.configPlistFileName = @"TinyPart.bundle/TinyPart.plist"; context.modulePlistFileName = @"TinyPart.bundle/TinyPart.plist"; context.servicePlistFileName = @"TinyPart.bundle/TinyPart.plist"; context.routerPlistFileName = @"TinyPart.bundle/TinyPart.plist"; [TinyPart sharedInstance].context = [TPContext sharedContext]; return [super application:application didFinishLaunchingWithOptions:launchOptions]; } @end
- 新建 plist 文件 'TinyPart.bundle/TinyPart.plist'
模塊Module
- 定義并注冊(cè)一個(gè)模塊
#import "TinyPart.h" @interface TestModule : NSObject@end @implementation TestModule TP_MODULE_AUTO_REGISTER // 自動(dòng)注冊(cè)模塊,動(dòng)態(tài)注冊(cè)模塊 TP_MODULE_ASYNC // 異步啟動(dòng)模塊,優(yōu)化開屏性能 TP_MODULE_PRIORITY(1) // 模塊啟動(dòng)優(yōu)先級(jí),優(yōu)先級(jí)高的先啟動(dòng) TP_MODULE_LEVEL(TPModuleLevelBasic) // 模塊級(jí)別:基礎(chǔ)模塊 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { return YES; } - (void)moduleDidLoad:(TPContext *)context { switch (context.env) { case TPRunningEnviromentTypeDebug: { NSLog(@"%@", @"TestModule1 moduleDidLoad: debug"); break; } case TPRunningEnviromentTypeRelease: { NSLog(@"%@", @"TestModule1 moduleDidLoad: release"); break; } } } @end
如果沒有使用TP_MODULE_AUTO_REGISTER?
自動(dòng)注冊(cè)宏的話,還需要將TestModule1加到TinyPart.plist
配置文件中。
?
服務(wù)Service用法
- 定義并注冊(cè)一個(gè)服務(wù)Service。Service可自定義單例模式或多例模式。
#import "TPServiceProtocol.h" @protocol TestModuleService1- (void)function1; @end @interface TestModuleService1Imp : NSObject @end @implementation TestModuleService1Imp TPSERVICE_AUTO_REGISTER(TestModuleService1) // 自動(dòng)注冊(cè)服務(wù) - (void)function1 { NSLog(@"%@", @"TestModuleService1 function1"); } @end
如果沒有使用TPSERVICE_AUTO_REGISTER?
自動(dòng)注冊(cè)宏的話,還需要將TestModuleService1加到TinyPart.plist
配置文件中。
- 訪問(wèn)服務(wù)Sevice
idservice1 = [[TPServiceManager sharedInstance] serviceWithName:@"TestModuleService1"]; [service1 function1];
路由Router用法
- 定義并注冊(cè)一個(gè)路由Router
#import "TPRouter.h" @interface TestRouter : TPRouter @end #import "TinyPart.h" @implementation TestRouter TPROUTER_AUTO_REGISTER // 自動(dòng)注冊(cè)路由 // APP身份驗(yàn)證,需要實(shí)現(xiàn)TPMediatorDelegate中的身份驗(yàn)證回調(diào) TPRouter_AUTH_REQUIRE(@"action1", @"action2") TPROUTER_METHOD_EXPORT(action1, { NSLog(@"TestRouter action1 params=%@", params); return nil; }); TPROUTER_METHOD_EXPORT(action2, { NSLog(@"TestRouter action2 params=%@", params); return nil; }); @end
如果沒有使用TPROUTER_AUTO_REGISTER
自動(dòng)注冊(cè)宏的話,還需要將TestModuleService1加到TinyPart.plist
配置文件中。
?
- 使用路由Router
[[TPMediator sharedInstance] performAction:@"action1" router:@"Test" params:@{}];
URL路由
-
新建
TinyPart.bundle/TinyPart.plist
,并注冊(cè)一條URL Scheme
APPURLSchemes
tinypart
-
定義一條URL路由規(guī)則。在已有的
TestRouter
基礎(chǔ)上,我們只需要新建一個(gè)TPMediator+Test
的擴(kuò)展。
@implementation TPMediator (Test) + (void)load { // 聲明TestRouter對(duì)應(yīng)的Host TPURLHostForRouter(@"com.tinypart.test", TestRouter) // tinypart://com.tinypart.test // 聲明TestRouter中action1對(duì)應(yīng)的Path TPURLPathForActionForRouter(@"/action1", action1, TestRouter); // tinypart://com.tinypart.test/action1 } @end
- 使用URL路由
NSURL *url = [NSURL URLWithString:@"tinypart://com.tinypart.test/action1?id=1&name=tinypart"]; [[TPMediator sharedInstance] openURL:url];
有向通信
-
發(fā)送。這里注意前面提到的,底層模塊對(duì)上層模塊的通知稱為廣播
Broadcast
,上層模塊對(duì)底層模塊或者同層模塊的通知稱為上報(bào)Report
。模塊級(jí)別分為Basic、Middle、Topout三個(gè)級(jí)別。
TPNotificationCenter *center2 = [TestModule2 tp_notificationCenter]; [center2 reportNotification:^(TPNotificationMaker *make) { make.name(@"report_notification_from_TestModule2"); } targetModule:@"TestModule1"]; [center2 broadcastNotification:^(TPNotificationMaker *make) { make.name(@"broadcast_notification_from_TestModule2").userInfo(@{@"key":@"value"}).object(self); }];
- 接收
TPNotificationCenter *center1 = [TestModule1 tp_notificationCenter]; // Observer銷毀后自動(dòng)釋放 [center1 addObserver:self selector:@selector(testNotification:) name:@"report_notification_from_TestModule2" object:nil];
?
?
- 電路模塊化電路圖紙參考設(shè)計(jì) 15次下載
- 模塊化逆變電源的設(shè)計(jì)與應(yīng)用總結(jié)
- 電賽模塊化程序案例下載 12次下載
- FPGA模塊化設(shè)計(jì)與AlteraHardCopy結(jié)構(gòu)化ASIC 6次下載
- 如何從Java轉(zhuǎn)型Objective-C的詳細(xì)資料分析 2次下載
- Objective-C與Runtime的詳細(xì)資料介紹讓你不在問(wèn)為什么 3次下載
- ObjectiveC-Class-Ivar-Layout的使用方法詳解 2次下載
- objective-c簡(jiǎn)體中文手冊(cè) 14次下載
- 基于Objective-C實(shí)現(xiàn)動(dòng)態(tài)加載 2次下載
- 單片機(jī)的C語(yǔ)言模塊化編程 51次下載
- 從Objective-C向Swift轉(zhuǎn)換經(jīng)驗(yàn)分享 0次下載
- 第15章objective-C編程語(yǔ)言 0次下載
- Objective-C基礎(chǔ)教程 2次下載
- 模塊化程序設(shè)計(jì) 0次下載
- 模塊化程序設(shè)計(jì) 9次下載
- 模塊化插座接線方法有哪些 697次閱讀
- LumiDL TM模塊化照明器介紹 783次閱讀
- 模塊化原理和方法 模塊化的方法和注意事項(xiàng) 2936次閱讀
- PLC模塊化和結(jié)構(gòu)化編程實(shí)例 1091次閱讀
- 模塊化機(jī)柜 vs.一體化機(jī)柜 745次閱讀
- 如何模塊化編程 1338次閱讀
- 基于一種模塊化的LED顯示屏設(shè)計(jì) 2037次閱讀
- 模塊化水表采集器的原理及設(shè)計(jì) 2126次閱讀
- 關(guān)于類別化與模塊化設(shè)計(jì)模式的解釋 5467次閱讀
- 解讀:一種基于模塊化設(shè)計(jì)的PLM平臺(tái)建設(shè) 1755次閱讀
- 手機(jī)射頻前端模塊化趨勢(shì)大講解 8592次閱讀
- 為什么選擇Caffe深度學(xué)習(xí)框架Caffe的安裝和程序概述 4268次閱讀
- 模塊化UPS電源的構(gòu)成以及優(yōu)缺點(diǎn)盤點(diǎn) 7273次閱讀
- 模塊化電源有什么優(yōu)勢(shì) 6755次閱讀
- 基于DSP的模塊化教育機(jī)器人硬件系統(tǒng)方案 2285次閱讀
下載排行
本周
- 1山景DSP芯片AP8248A2數(shù)據(jù)手冊(cè)
- 1.06 MB | 532次下載 | 免費(fèi)
- 2RK3399完整板原理圖(支持平板,盒子VR)
- 3.28 MB | 339次下載 | 免費(fèi)
- 3TC358743XBG評(píng)估板參考手冊(cè)
- 1.36 MB | 330次下載 | 免費(fèi)
- 4DFM軟件使用教程
- 0.84 MB | 295次下載 | 免費(fèi)
- 5元宇宙深度解析—未來(lái)的未來(lái)-風(fēng)口還是泡沫
- 6.40 MB | 227次下載 | 免費(fèi)
- 6迪文DGUS開發(fā)指南
- 31.67 MB | 194次下載 | 免費(fèi)
- 7元宇宙底層硬件系列報(bào)告
- 13.42 MB | 182次下載 | 免費(fèi)
- 8FP5207XR-G1中文應(yīng)用手冊(cè)
- 1.09 MB | 178次下載 | 免費(fèi)
本月
- 1OrCAD10.5下載OrCAD10.5中文版軟件
- 0.00 MB | 234315次下載 | 免費(fèi)
- 2555集成電路應(yīng)用800例(新編版)
- 0.00 MB | 33566次下載 | 免費(fèi)
- 3接口電路圖大全
- 未知 | 30323次下載 | 免費(fèi)
- 4開關(guān)電源設(shè)計(jì)實(shí)例指南
- 未知 | 21549次下載 | 免費(fèi)
- 5電氣工程師手冊(cè)免費(fèi)下載(新編第二版pdf電子書)
- 0.00 MB | 15349次下載 | 免費(fèi)
- 6數(shù)字電路基礎(chǔ)pdf(下載)
- 未知 | 13750次下載 | 免費(fèi)
- 7電子制作實(shí)例集錦 下載
- 未知 | 8113次下載 | 免費(fèi)
- 8《LED驅(qū)動(dòng)電路設(shè)計(jì)》 溫德爾著
- 0.00 MB | 6656次下載 | 免費(fèi)
總榜
- 1matlab軟件下載入口
- 未知 | 935054次下載 | 免費(fèi)
- 2protel99se軟件下載(可英文版轉(zhuǎn)中文版)
- 78.1 MB | 537798次下載 | 免費(fèi)
- 3MATLAB 7.1 下載 (含軟件介紹)
- 未知 | 420027次下載 | 免費(fèi)
- 4OrCAD10.5下載OrCAD10.5中文版軟件
- 0.00 MB | 234315次下載 | 免費(fèi)
- 5Altium DXP2002下載入口
- 未知 | 233046次下載 | 免費(fèi)
- 6電路仿真軟件multisim 10.0免費(fèi)下載
- 340992 | 191187次下載 | 免費(fèi)
- 7十天學(xué)會(huì)AVR單片機(jī)與C語(yǔ)言視頻教程 下載
- 158M | 183279次下載 | 免費(fèi)
- 8proe5.0野火版下載(中文版免費(fèi)下載)
- 未知 | 138040次下載 | 免費(fèi)
評(píng)論