【Toki組件化】通信中間件 TKModule

一、介紹

組件化這件事溯捆,簡(jiǎn)單理解就是把不同的業(yè)務(wù)拆分成單獨(dú)的項(xiàng)目去開(kāi)發(fā),組件之間可以出現(xiàn)引用關(guān)系厦瓢,但不可以出現(xiàn)依賴(lài)關(guān)系提揍。

由于組件是不可以依賴(lài)另一個(gè)組件的,這導(dǎo)致調(diào)用其他組件的對(duì)外接口成為了一件很麻煩的事煮仇,傳統(tǒng)方案是使用字符串映射Selector劳跃,這種方案依賴(lài)字符串這個(gè)不穩(wěn)定的Key,不但沒(méi)有代碼聯(lián)想浙垫,還會(huì)導(dǎo)致很多難以預(yù)測(cè)的問(wèn)題刨仑。
經(jīng)過(guò)一些嘗試,我發(fā)現(xiàn)了還有一種簡(jiǎn)單的方案夹姥。TKModule作為組件的中間件杉武,各組件可以通過(guò)創(chuàng)建TKModule的分類(lèi)實(shí)現(xiàn)對(duì)外接口,也通過(guò)TKModule去調(diào)用其他組件的對(duì)外接口辙售。

當(dāng)然轻抱,這也會(huì)帶來(lái)一些問(wèn)題:

  1. 我在開(kāi)發(fā)A組件的時(shí)候,不能依賴(lài)B組件旦部,那么我的開(kāi)發(fā)環(huán)境中就不存在B組件的對(duì)外接口祈搜,就沒(méi)法去調(diào)用较店。
  • 解決方案:組件間不可以依賴(lài),但是可以引用容燕。如果B組件的對(duì)外接口已經(jīng)聲明梁呈、實(shí)現(xiàn)并發(fā)布,我可以在A組件的Demo的Podfile添加B組件缰趋。
  1. 我在開(kāi)發(fā)A組件的時(shí)候捧杉,C組件的對(duì)外接口僅僅作出聲明陕见,尚未實(shí)現(xiàn)便發(fā)布了秘血,這時(shí)在A組件中調(diào)用C組件的對(duì)外接口 便會(huì)導(dǎo)致崩潰。
  • 解決方案: 在TKModule替換
    - (NSMethodSignature*)methodSignatureForSelector:(SEL)selector;
    - (void)forwardInvocation:(NSInvocation *)invocation;
    的實(shí)現(xiàn)评甜,使用戶(hù)(組件使用者)調(diào)用未實(shí)現(xiàn)的接口時(shí)會(huì)執(zhí)行一個(gè)空的實(shí)現(xiàn)灰粮,避免崩潰。
    此外忍坷,我也可以在A組件的Demo中粘舟,根據(jù)我的需要去實(shí)現(xiàn)這個(gè)接口。
  1. 我在開(kāi)發(fā)A組件的時(shí)候佩研,D組件尚發(fā)布柑肴,這時(shí)在A組件中如何調(diào)用D組件的接口。
  • 解決方案:遇到種情況我們可以在A組件中去聲明想要引用的接口旬薯。

二晰骑、基礎(chǔ)用法

  • 實(shí)現(xiàn)接口

//  TKModule+Account.h
//  TKMAccountModule

@interface TKModule (Account)

- (void)showLoginView;

@end
//  TKModule+Account.m
//  TKMAccountModule

@implementation TKModule (Account)

- (void)showLoginView {
    //展示登錄界面
}
  • 調(diào)用接口

//  TKMInitializeEntrance.m
//  TKMInitializeModule

#import "TKMInitializeEntrance.h"

@implementation TKMInitializeEntrance

...

- (void)loginButtonTapped {    
    [[TKModule shared] showLoginView];
}

...

@end

三、補(bǔ)充用法

  • 在組件中聲明其他組件的對(duì)外接口

//  TKModule+AccountRecharge.h
//  TKMAccountModule

#import "TKModule.h"

@interface TKModule (AccountRecharge)

- (void)showRechargeView;

@end
  • 在Demo中實(shí)現(xiàn)其他組件的對(duì)外接口

//  TKModule+Mock.m
//  TKMAccountModule-Example

#import <TKModule/TKModule.h>

@implementation TKModule (Mock)

- (void)showRechargeView {
    //展示充值頁(yè)面
}

@end

四绊序、代碼

TKModule 地址

//  TKModule.h

#import <Foundation/Foundation.h>

NS_ASSUME_NONNULL_BEGIN

typedef void(^TKModuleUnrecognizedSelectorCallback)(SEL);

@interface TKModule : NSObject

@property (nonatomic, strong) TKModuleUnrecognizedSelectorCallback unrecognizedSelectorCallback;

+ (instancetype)shared;

@end

NS_ASSUME_NONNULL_END
//  TKModule.m

#import "TKModule.h"

#import <objc/runtime.h>

@implementation TKModule

#pragma mark - shared

+ (instancetype)shared {
    static id instance = nil;
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        instance = [[self alloc] init];
    });
    return instance;
}

#pragma mark - Unrecognized

- (NSMethodSignature*)methodSignatureForSelector:(SEL)selector {
    NSMethodSignature *signature = [super methodSignatureForSelector:selector];
    if (!signature) {
        if (self.unrecognizedSelectorCallback) self.unrecognizedSelectorCallback(selector);
        signature = self.voidSignature;
    }
    return signature;
}

- (void)forwardInvocation:(NSInvocation *)invocation {
    if (![invocation.methodSignature isEqual:self.voidSignature]) {
        [super forwardInvocation:invocation];
    }
}

#pragma mark - util

- (NSMethodSignature *)voidSignature {
    return [self methodSignatureForSelector:@selector(unrecognizedSelectorBackUp)];
}

- (void)unrecognizedSelectorBackUp {
    
}

@end
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末硕舆,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子骤公,更是在濱河造成了極大的恐慌抚官,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,386評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件阶捆,死亡現(xiàn)場(chǎng)離奇詭異凌节,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)洒试,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,142評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門(mén)刊咳,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人儡司,你說(shuō)我怎么就攤上這事娱挨。” “怎么了跷坝?”我有些...
    開(kāi)封第一講書(shū)人閱讀 164,704評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵淮韭,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我占键,道長(zhǎng)畔乙,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,702評(píng)論 1 294
  • 正文 為了忘掉前任,我火速辦了婚禮难述,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘择同。我一直安慰自己,他們只是感情好紧武,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,716評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布妥箕。 她就那樣靜靜地躺著坎吻,像睡著了一般。 火紅的嫁衣襯著肌膚如雪诸尽。 梳的紋絲不亂的頭發(fā)上污尉,一...
    開(kāi)封第一講書(shū)人閱讀 51,573評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音兴喂,去河邊找鬼衣迷。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的陨界。 我是一名探鬼主播,決...
    沈念sama閱讀 40,314評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼动猬,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了崔拥?” 一聲冷哼從身側(cè)響起凤覆,我...
    開(kāi)封第一講書(shū)人閱讀 39,230評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤链瓦,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后盯桦,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體慈俯,經(jīng)...
    沈念sama閱讀 45,680評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,873評(píng)論 3 336
  • 正文 我和宋清朗相戀三年拥峦,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了贴膘。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,991評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡略号,死狀恐怖刑峡,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情玄柠,我是刑警寧澤突梦,帶...
    沈念sama閱讀 35,706評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站羽利,受9級(jí)特大地震影響宫患,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜铐伴,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,329評(píng)論 3 330
  • 文/蒙蒙 一撮奏、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧当宴,春花似錦畜吊、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,910評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至,卻和暖如春捌年,著一層夾襖步出監(jiān)牢的瞬間瓢娜,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,038評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工礼预, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留眠砾,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,158評(píng)論 3 370
  • 正文 我出身青樓托酸,卻偏偏與公主長(zhǎng)得像褒颈,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子励堡,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,941評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容