iOS - BeeHive和CTMediator的使用

什么是組件化

一般指項目根據(jù)不同的業(yè)務劃分的模塊化,也可以理解為通用控件的封裝巧号,提供接口方便別人調用浓瞪。

為什么要做組件化

組件化可以實現(xiàn)組件之間的隔離,每個組件單獨存在女轿,在做項目時可以利用現(xiàn)有功能組件進行拼裝箭启,達到快速開發(fā)的目的。

普通組件化

1蛉迹、創(chuàng)建一個主項目工程

image.png

2傅寡、創(chuàng)建兩個本地組件module

image.png

生成對應的podspec,后面可以單獨放到自己的倉庫,依賴pod管理北救。然后加上自己想要的功能代碼荐操,在主項目的podfile中添加pod引入

 pod 'CTMediatorModule',:path=>'../CTMediatorModule'
 pod 'BeeHiveModule',:path=>'../BeeHiveModule'

到這里生成的BeeHiveModule和CTMediatorModule兩個模塊其實已經制作完成可以正常的使用。
module結構如下:

image.png

主項目使用

#import "BeeHiveViewController.h"

- (void)clickBeeHiveButton {
    BeeHiveViewController *beeViewController = [BeeHiveViewController new];
    beeViewController.tipsStr = @"測試";
    [self.navigationController pushViewController:beeViewController animated:YES];  
}

可以看出現(xiàn)在的使用是需要引入BeeHiveModule模塊內的類珍策,如果存在組件之間的通信托启,各個組件之間都是直接依賴,就是組件直接#import被調用的組件攘宙,這些依賴關系凌亂而且復雜屯耸,在這種依賴關系下,如果想要多個組件并行開發(fā)蹭劈,必須跟其他組件開發(fā)者做好接口約定疗绣,這里可能會有一份組件的接口文檔,當組件接口出現(xiàn)變動時铺韧,需要通知所有此組件的使用者修改調用方法多矮,這種情況下,后期維護會非常困難祟蚀。

問題

如上所說工窍,這樣的組件之間存在大量的耦合割卖,維護成本增加,拓展性不強患雏。

解決

在這種情況下鹏溯,中間過度類應運而生,使得對組件的依賴轉移到中間類上淹仑。

BeeHive和CTMediator

BeeHiveCTMediator是兩個常用的中間件通用工具丙挽。

一、CTMediator

CTMediator內部是使用下列runtime方法實現(xiàn)的匀借。
使用CTMediator需要創(chuàng)建對應規(guī)則的target-action颜阐、CTMediato分類。

[圖片上傳失敗...(image-500833-1667375048529)]

1吓肋、創(chuàng)建target-action
target類的類名必須以Target_開頭凳怨,比如Target_A,action的方法名必須以Action_開頭是鬼,比如Action_CCModuleTestView:(NSDictionary *)params肤舞。

@implementation Target_ModuleTestView
- (UIView *)Action_CCModuleTestView:(NSDictionary *)params {
    ModuleTestView *view = [[ModuleTestView alloc] init];
    view.titleStr = [params objectForKey:@"titleStr"];//接收參數(shù)
    return view;
}
@end

2、創(chuàng)建CTMediator的分類
此分類用于外部調用均蜜。

NSString *const kTarget_ModeuleTest = @"ModuleTestView";//Target_A中的A
NSString *const kAction_ModeuleTest = @"CCModuleTestView";//Action_XX中的XX李剖。

@implementation CTMediator (ModuleTest)
- (UIView *)moduleViewWithParams:(NSDictionary *)params {
    UIView *view = [self performTarget:kTarget_ModeuleTest action:kAction_ModeuleTest params:params shouldCacheTarget:YES];
    return view;
}
@end

外部調用:

- (void)clickCTMediatorButton {
    UIView *view = [[CTMediator sharedInstance] moduleViewWithParams:@{@"titleStr":@"這是個參數(shù)--CTMediator"}];
    view.backgroundColor = [UIColor redColor];
    [self.view addSubview:view];
    [view mas_makeConstraints:^(MASConstraintMaker *make) {
        make.top.equalTo(self.view.mas_top).offset(400);
        make.left.equalTo(self.view.mas_left).offset(100);
        make.right.equalTo(self.view.mas_right).offset(-100);
        make.height.mas_equalTo(200);
    }];
}

中間件雖然可以使模塊間的具體實現(xiàn)與接口解耦,但無法避免對接口類的依賴關系囤耳。

二篙顺、BeeHive

BeeHive使用protocol-impClass方式來表示映射關系,protocol表示目標組件對外暴露的方法充择,impClass表示目標組件德玫。
1、BeeHive可以監(jiān)控系統(tǒng)事件聪铺,通常是Application生命周期事件化焕,例如DidBecomeActive、WillEnterBackground等铃剔。
一般做法是把BHAppDelegate接管原來的AppDelegate撒桨。

@interface AppDelegate : BHAppDelegate

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    [super application:application didFinishLaunchingWithOptions:launchOptions];
    return YES;
}

2、創(chuàng)建protocol(用來暴露外部供外部調用)和module類(用來注冊protocol-impClass映射關系)键兜。

[圖片上傳失敗...(image-abb4ce-1667375048529)]

BeeModule內部是注冊Protocol

@implementation BeeModule
//在啟動之后第一屏內容展現(xiàn)之前異步執(zhí)行模塊的初始化凤类,可以優(yōu)化啟動時時間消耗
BH_EXPORT_MODULE(YES)

- (void)modInit:(BHContext *)context {
    //注冊模塊的接口服務
    [[BeeHive shareInstance] registerService:@protocol(BeeServiceProtocol) service:[BeeHiveViewController class]];
}
@end

在調用組件時,調用者將目標組件的協(xié)議protocol作為參數(shù)傳給BeeHive普气,根據(jù)上述注冊的映射關系protocol-impClass谜疤,獲取協(xié)議protocol對應的實現(xiàn)類impClass。

- (void)clickBeeHiveButton {
    id<BeeServiceProtocol> beeViewController = [[BeeHive shareInstance] createService:@protocol(BeeServiceProtocol)];
    if ([beeViewController isKindOfClass:[UIViewController class]]) {
        [beeViewController beeViewControllerParams:@"這個是個參數(shù)--beehive"];
        UIViewController *beeVC = (UIViewController *)beeViewController;
        [self.navigationController pushViewController:beeVC animated:YES];
    }
}

現(xiàn)在只是依賴了BeeServiceProtocol。

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末夷磕,一起剝皮案震驚了整個濱河市履肃,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌坐桩,老刑警劉巖尺棋,帶你破解...
    沈念sama閱讀 206,214評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異绵跷,居然都是意外死亡膘螟,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,307評論 2 382
  • 文/潘曉璐 我一進店門碾局,熙熙樓的掌柜王于貴愁眉苦臉地迎上來荆残,“玉大人,你說我怎么就攤上這事净当∧谒梗” “怎么了?”我有些...
    開封第一講書人閱讀 152,543評論 0 341
  • 文/不壞的土叔 我叫張陵蚯瞧,是天一觀的道長嘿期。 經常有香客問我,道長埋合,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,221評論 1 279
  • 正文 為了忘掉前任萄传,我火速辦了婚禮甚颂,結果婚禮上,老公的妹妹穿的比我還像新娘秀菱。我一直安慰自己振诬,他們只是感情好,可當我...
    茶點故事閱讀 64,224評論 5 371
  • 文/花漫 我一把揭開白布衍菱。 她就那樣靜靜地躺著赶么,像睡著了一般。 火紅的嫁衣襯著肌膚如雪脊串。 梳的紋絲不亂的頭發(fā)上辫呻,一...
    開封第一講書人閱讀 49,007評論 1 284
  • 那天,我揣著相機與錄音琼锋,去河邊找鬼放闺。 笑死,一個胖子當著我的面吹牛缕坎,可吹牛的內容都是我干的怖侦。 我是一名探鬼主播,決...
    沈念sama閱讀 38,313評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼匾寝!你這毒婦竟也來了搬葬?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 36,956評論 0 259
  • 序言:老撾萬榮一對情侶失蹤艳悔,失蹤者是張志新(化名)和其女友劉穎踩萎,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體很钓,經...
    沈念sama閱讀 43,441評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡香府,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 35,925評論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了码倦。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片企孩。...
    茶點故事閱讀 38,018評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖袁稽,靈堂內的尸體忽然破棺而出勿璃,到底是詐尸還是另有隱情,我是刑警寧澤推汽,帶...
    沈念sama閱讀 33,685評論 4 322
  • 正文 年R本政府宣布补疑,位于F島的核電站,受9級特大地震影響歹撒,放射性物質發(fā)生泄漏莲组。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,234評論 3 307
  • 文/蒙蒙 一暖夭、第九天 我趴在偏房一處隱蔽的房頂上張望锹杈。 院中可真熱鬧,春花似錦迈着、人聲如沸竭望。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,240評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽咬清。三九已至,卻和暖如春奴潘,著一層夾襖步出監(jiān)牢的瞬間旧烧,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,464評論 1 261
  • 我被黑心中介騙來泰國打工萤彩, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留粪滤,地道東北人。 一個月前我還...
    沈念sama閱讀 45,467評論 2 352
  • 正文 我出身青樓雀扶,卻偏偏與公主長得像杖小,于是被迫代替她去往敵國和親肆汹。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 42,762評論 2 345

推薦閱讀更多精彩內容