iOS組件化的一些總結(jié)

去年開始,組件化模式越來越火,最近自己才開始研究,畢竟公司項(xiàng)目小,不值得去改,作為一個(gè)菜鳥!剛開始看的云里霧里的,最近才看明白一些具體實(shí)現(xiàn)方式。具體大原理,模式網(wǎng)上很多解釋,這里就不多說了,只寫一下個(gè)人具體怎么實(shí)現(xiàn):

一、蘑菇街組件化方式

蘑菇街是以注冊(cè)表的方式進(jìn)行組件化的,首先要導(dǎo)入MGJRouter這個(gè)總的路由類(自認(rèn)為自己寫的沒有人家完善,所以直接拿來用了),這個(gè)類提供了提供服務(wù)的類注冊(cè)u(píng)rl到注冊(cè)表中,以及調(diào)用類調(diào)用的url的方法!然后每個(gè)模塊自己?jiǎn)为?dú)創(chuàng)建一個(gè)路由類,作為將服務(wù)注冊(cè)到路由器的注冊(cè)表中,這樣我們就可以依據(jù)直接查找模塊的路由類來看看,這個(gè)模塊對(duì)外提供了哪些服務(wù),可讀性更強(qiáng),解耦性更高!注冊(cè)完后,把注冊(cè)的url寫到一個(gè)總的頭文件中供全局調(diào)用!

蘑菇街模式是以u(píng)rl路徑的方式,可以有多層路徑,注冊(cè)時(shí)候按照“/”進(jìn)行路徑分割,每層路徑對(duì)應(yīng)一個(gè)可變字典,保存下一級(jí)的路徑,然后一直到尾端的調(diào)用block

調(diào)用的時(shí)候?qū)訉硬檎遥峭ㄟ^key值層層匹配調(diào)用服務(wù)的,個(gè)人理解這種方式是犧牲空間換取時(shí)間的方式,通過路徑的方式就不至于每次調(diào)用從所有的url的字典中取,而且通過路徑層層遞進(jìn),這樣每次取得時(shí)候需要遍歷的量就少很多!

集成時(shí)候遇到問題就是傳參問題,我是通過字典進(jìn)行傳值,雖然可以通過get的拼接傳值,但個(gè)人不喜歡,所以沒用,在注冊(cè)u(píng)rl的時(shí)候,每個(gè)注冊(cè)里面都加了這個(gè)方法,利用kvc將傳進(jìn)來的參數(shù)賦給對(duì)應(yīng)的對(duì)象。簡(jiǎn)單,方便!

NSDictionary *dic = (NSDictionary *)routerParameters[@"MGJRouterParameterUserInfo"];

for (NSString *key in dic.allKeys) {

[vc setValue:dic[key] forKey:key];

}

中間遇到的問題就是,假如服務(wù)方需要調(diào)用方完成回調(diào)就不好了,假如調(diào)用方遵守服務(wù)方的協(xié)議,那么就又引起依賴關(guān)系了,那么就引入了協(xié)議的方式,我解決的方法就是創(chuàng)建一個(gè)協(xié)議總類,把模塊對(duì)外的協(xié)議全部寫到這個(gè)總類里面,這樣調(diào)用方和服務(wù)方只要依賴這個(gè)協(xié)議總類即可!這樣就解決了調(diào)用方和服務(wù)方的互相依賴問題!

蘑菇街還有一種方式就是所有的提供服務(wù)的方式都已代理的方式,

就是引入ModeuleManager這個(gè)類,具體實(shí)現(xiàn):

+ (instancetype)sharedInstance

{

static ModuleManager *instance = nil;

static dispatch_once_t onceToken;

dispatch_once(&onceToken, ^{

instance = [[self alloc] init];

});

return instance;

}

+ (void)registerProtocol:(Protocol *)proto forClass:(Class)cls {

ModuleManager *instance = [self sharedInstance];

[instance.protocolCache setObject:cls forKey:NSStringFromProtocol(proto)];

}

+ (Class)classForProtocol:(Protocol *)proto {

ModuleManager *instance = [self sharedInstance];

return instance.protocolCache[NSStringFromProtocol(proto)];

}

-(NSMutableDictionary *)protocolCache{

if (!_protocolCache) {

_protocolCache = [NSMutableDictionary dictionary];

}return _protocolCache;

}

這樣就是提供一個(gè)總的代理類,當(dāng)調(diào)用方需要某個(gè)服務(wù)時(shí)候,通過+ (Class)classForProtocol:(Protocol *)proto得到提供服務(wù)的類,然后創(chuàng)建對(duì)象執(zhí)行,創(chuàng)建的對(duì)象可以寫成id<Protocol> vc這個(gè)形式,這樣就可以直接調(diào)用對(duì)外的服務(wù)方法了

二、casatwy組件化方案

casatwy組件化方案分為兩種調(diào)用方式,遠(yuǎn)程調(diào)用和本地調(diào)用,對(duì)于兩個(gè)不同的調(diào)用方式分別對(duì)應(yīng)兩個(gè)接口。

需要引入CTMediator這個(gè)中間類,他提供了遠(yuǎn)程app調(diào)用入口和本地app調(diào)用入口,

遠(yuǎn)程調(diào)用通過AppDelegate代理方法傳遞到當(dāng)前應(yīng)用后,調(diào)用遠(yuǎn)程接口并在內(nèi)部做一些處理,處理完成后會(huì)在遠(yuǎn)程接口內(nèi)部調(diào)用本地接口,以實(shí)現(xiàn)本地調(diào)用為遠(yuǎn)程調(diào)用服務(wù)

本地調(diào)用由performTarget:action:params:方法負(fù)責(zé),但調(diào)用方一般不直接調(diào)用performTarget:方法。CTMediator會(huì)對(duì)外提供明確參數(shù)和方法名的方法,在方法內(nèi)部調(diào)用performTarget:方法和參數(shù)的轉(zhuǎn)換。

該種模式是同runtime實(shí)現(xiàn)調(diào)用的方法,然后每個(gè)模塊有自己的執(zhí)行類,和CTMediator的分類,但是調(diào)用方如果需要服務(wù)方的服務(wù),就要引入服務(wù)方的這個(gè)分類,這樣就形成了依賴關(guān)系,所以暫時(shí)沒用這些!

相比較蘑菇街的,這種方法少了注冊(cè)這一步,也不用創(chuàng)建一個(gè)保存全部url的總類!調(diào)用方法更清晰,邏輯更簡(jiǎn)單!但是由于調(diào)用方需要依賴服務(wù)方的分類,也算一種依賴關(guān)系!具體取舍還是看自己,不過遠(yuǎn)程調(diào)用這個(gè)方式還不錯(cuò),可以借鑒下

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

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