最近在看組件化相關內容安接,然后研究了下目前用的比較多的組件化方式,casa大神提供的CTMediator組件化方式。
組件化改造前后對比圖.png
這里使用下別人的一個圖片來說明組件化的作用盏檐。在組件化之前歇式,各個模塊之間的依賴很嚴重,如果想要獨立某個功能胡野,難上加難材失,引入CTMediator的組件化思路之后,很容易解偶硫豆,各個模塊之間相互獨立龙巨,想怎么玩就怎么玩。
下面我說下到底要怎么通過該思路去實現(xiàn)本地組件之間的相互調用熊响,源碼的解讀我就不去做解釋了旨别,原理其實很簡單,通過runtime運行時方式汗茄,通過類(class)去執(zhí)行方法(selector)秸弛。
我demo中的結構
這個是我demo實踐的項目結構,假如
HomeController
是我整個項目的主頁洪碳,它需要調用其他項目團隊開發(fā)的組件ModuleA
递览,我們只需要在咱們的項目中創(chuàng)建一個基于CTMediator的類別,同時組件ModuleA只需要創(chuàng)建一個中間類Target_ModuleA就可以實現(xiàn)從咱們的App調用組件的功能瞳腌,組件團隊又可以獨立完成自己的內容绞铃,完全符合架構思想“開閉原則”。
這里要注意的是:在組件創(chuàng)建公開API的時候纯趋,類名需要以Target_
開頭憎兽,方法名需要以Action_
開頭,原因是因為源碼里的方法是需要根據(jù)此開頭內容判斷Class和Method的吵冒,可以自己去研究下源碼里的方法- (id)performTarget:(NSString *)targetName action:(NSString *)actionName params:(NSDictionary *)params shouldCacheTarget:(BOOL)shouldCacheTarget;
下面是我各個文件的代碼纯命,供參考
CTMediator+InteractiveModule.m文件內容:
#import "CTMediator+InteractiveModule.h"
@implementation CTMediator (InteractiveModule)
- (UIViewController *)interactiveModuleA:(NSDictionary *)params{
UIViewController *moduleAController = [self performTarget:@"ModuleA" action:@"nativeCallModuleA" params:params shouldCacheTarget:NO];
return moduleAController;
}
@end
Target_ModuleA.m文件內容:
#import "Target_ModuleA.h"
#import "OneViewController.h"
@implementation Target_ModuleA
- (UIViewController *)Action_nativeCallModuleA:(NSDictionary *)params
{
// 組件控制內部跳轉
OneViewController *controller = [OneViewController new];
controller.params = params;
return controller;
}
@end