iOS的組件化(模塊化)之路

什么是組件化晾匠?
打個(gè)比方,一臺(tái)電腦由CPU梯刚、內(nèi)存凉馆、硬盤(pán)等組件組成,他們拆卸下來(lái)之后放在其他地方也是可以使用的亡资,且CPU與硬盤(pán)之間是沒(méi)有任何聯(lián)系的澜共。

為什么要組件化?
而代碼在慢慢堆積起來(lái)之后锥腻,許多類(lèi)之間都存在著“你離不開(kāi)我嗦董,我離不開(kāi)你”的情況,這就會(huì)導(dǎo)致開(kāi)發(fā)效率低下瘦黑,且容易造成代碼沖突京革。其實(shí)說(shuō)白了就是耦合度太高。這樣揉成一坨對(duì)測(cè)試/編譯/開(kāi)發(fā)效率/后續(xù)擴(kuò)展都有一些壞處

每個(gè)模塊都離不開(kāi)其他模塊幸斥,互相依賴(lài)粘在一起成為一坨

「組件化」顧名思義就是把一個(gè)大的 App 拆成一個(gè)個(gè)小的組件匹摇,相互之間不直接引用。那如何做呢甲葬?

組件化

實(shí)現(xiàn)方式

理想設(shè)計(jì)圖廊勃,源于微信讀書(shū)

照理想設(shè)計(jì)圖所示,Mediator作為一個(gè)中間件起著調(diào)度各個(gè)模塊的作用演顾,那么Mediator 怎么去轉(zhuǎn)發(fā)組件間調(diào)用供搀?
本文將以 JLRoutes 作為Mediator。

在使用JLRoutes之前钠至,請(qǐng)配置scheme葛虐,詳見(jiàn)
http://blog.csdn.net/u010127917/article/details/50451251

JLRoutes本質(zhì)可以理解為:保存一個(gè)全局的Map,key是url棉钧,value是對(duì)應(yīng)的block屿脐。這樣在下面的代碼中:

- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation { 
  return [JLRoutes routeURL:url];
}

如果自己被打開(kāi):

NSURL *viewUserURL = [NSURL URLWithString:@"myapp://user/view/joeldev"];
[[UIApplication sharedApplication] openURL:viewUserURL];

JLRoutes就可以遍歷這個(gè)全局的map,通過(guò)url來(lái)執(zhí)行對(duì)應(yīng)的block。

廢話不多說(shuō)的诵,直接上代碼吧万栅!
appdelegate中設(shè)置好匹配規(guī)則
然后根據(jù)傳遞過(guò)來(lái)的參數(shù)進(jìn)行跳轉(zhuǎn)

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { 
//    navigationPush規(guī)則
    [JLRoutes addRoute:@"/NaviPush/:controller" handler:^BOOL(NSDictionary<NSString *,NSString *> * _Nonnull parameters) {
//        獲取當(dāng)前控制器
        UIViewController *currentVc = [self currentViewController];
        UIViewController *v = [[NSClassFromString(parameters[@"controller"]) alloc] init];
        [self paramToVc:v param:parameters];
        
        currentVc.hidesBottomBarWhenPushed = YES;
        [currentVc.navigationController pushViewController:v animated:YES];
        currentVc.hidesBottomBarWhenPushed = NO;
        return YES;
    }];
    //    StoryBoardPush規(guī)則
    [JLRoutes addRoute:@"/StoryBoardPush" handler:^BOOL(NSDictionary<NSString *,NSString *> * _Nonnull parameters) {
        //        獲取當(dāng)前控制器
        UIViewController *currentVc = [self currentViewController];
        UIStoryboard *storyboard = [UIStoryboard storyboardWithName:parameters[@"sbname"] bundle:nil];
        UIViewController *v  = [storyboard instantiateViewControllerWithIdentifier:parameters[@"bundleid"]];
        [self paramToVc:v param:parameters];
        
        currentVc.hidesBottomBarWhenPushed = YES;
        [currentVc.navigationController pushViewController:v animated:YES];
        currentVc.hidesBottomBarWhenPushed = NO;
        return YES;
    }];
return YES;
}

其實(shí)在這個(gè)環(huán)境下不引用任何需要跳轉(zhuǎn)的控制器來(lái)進(jìn)行參數(shù)傳遞是個(gè)麻煩的問(wèn)題,
所以使用runtime來(lái)進(jìn)行參數(shù)的傳遞

-(void)paramToVc:(UIViewController *) v param:(NSDictionary<NSString *,NSString *> *)parameters{
    //        runtime將參數(shù)傳遞至需要跳轉(zhuǎn)的控制器
    unsigned int outCount = 0;
    objc_property_t * properties = class_copyPropertyList(v.class , &outCount);
    for (int i = 0; i < outCount; i++) {
        objc_property_t property = properties[i];
        NSString *key = [NSString stringWithUTF8String:property_getName(property)];
        NSString *param = parameters[key];
        if (param != nil) {
            [v setValue:param forKey:key];
        }
    }
}

控制器發(fā)送跳轉(zhuǎn)規(guī)則及參數(shù)

-(void)btnClick:(UIButton *) sender{
    if (sender.tag == 0) {
        NSString *customURL = @"TESTDEMO://NaviPush/SecondViewController?userId=99999&age=18";
        [[UIApplication sharedApplication] openURL:[NSURL URLWithString:customURL]];
    }else{
        NSString *customURL = @"TESTDEMO://StoryBoardPush?sbname=Main&bundleid=SBVC";
        [[UIApplication sharedApplication] openURL:[NSURL URLWithString:customURL]];
    }
}

干貨來(lái)了N靼獭7沉!!
https://github.com/sthyuhao/JLRDemo

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末代赁,一起剝皮案震驚了整個(gè)濱河市扰她,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌芭碍,老刑警劉巖徒役,帶你破解...
    沈念sama閱讀 206,482評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異窖壕,居然都是意外死亡忧勿,警方通過(guò)查閱死者的電腦和手機(jī)储笑,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,377評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門(mén)肾扰,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人蚌成,你說(shuō)我怎么就攤上這事卸夕〔闶停” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 152,762評(píng)論 0 342
  • 文/不壞的土叔 我叫張陵快集,是天一觀的道長(zhǎng)贡羔。 經(jīng)常有香客問(wèn)我,道長(zhǎng)个初,這世上最難降的妖魔是什么乖寒? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,273評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮院溺,結(jié)果婚禮上楣嘁,老公的妹妹穿的比我還像新娘。我一直安慰自己珍逸,他們只是感情好逐虚,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,289評(píng)論 5 373
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著谆膳,像睡著了一般叭爱。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上漱病,一...
    開(kāi)封第一講書(shū)人閱讀 49,046評(píng)論 1 285
  • 那天买雾,我揣著相機(jī)與錄音把曼,去河邊找鬼。 笑死漓穿,一個(gè)胖子當(dāng)著我的面吹牛嗤军,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播晃危,決...
    沈念sama閱讀 38,351評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼叙赚,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了僚饭?” 一聲冷哼從身側(cè)響起纠俭,我...
    開(kāi)封第一講書(shū)人閱讀 36,988評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎浪慌,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體朴则,經(jīng)...
    沈念sama閱讀 43,476評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡权纤,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,948評(píng)論 2 324
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了乌妒。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片汹想。...
    茶點(diǎn)故事閱讀 38,064評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖撤蚊,靈堂內(nèi)的尸體忽然破棺而出古掏,到底是詐尸還是另有隱情,我是刑警寧澤侦啸,帶...
    沈念sama閱讀 33,712評(píng)論 4 323
  • 正文 年R本政府宣布槽唾,位于F島的核電站,受9級(jí)特大地震影響光涂,放射性物質(zhì)發(fā)生泄漏庞萍。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,261評(píng)論 3 307
  • 文/蒙蒙 一忘闻、第九天 我趴在偏房一處隱蔽的房頂上張望钝计。 院中可真熱鬧,春花似錦齐佳、人聲如沸私恬。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,264評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)本鸣。三九已至,卻和暖如春缺厉,著一層夾襖步出監(jiān)牢的瞬間永高,已是汗流浹背隧土。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,486評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留命爬,地道東北人曹傀。 一個(gè)月前我還...
    沈念sama閱讀 45,511評(píng)論 2 354
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像饲宛,于是被迫代替她去往敵國(guó)和親皆愉。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,802評(píng)論 2 345

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

  • 前言: 本文轉(zhuǎn)自前同事casa的博文艇抠,這篇文章是基于runtime實(shí)現(xiàn)的iOS組件化方案幕庐,其實(shí)iOS組件化方案基本...
    monkey01閱讀 1,651評(píng)論 1 2
  • Bang 博客 iOS 組件化方案探索 看了 Limboy(文章1文章2) 和 Casa (文章) 對(duì) iOS 組...
    其實(shí)也沒(méi)有閱讀 641評(píng)論 0 0
  • 傳統(tǒng)項(xiàng)目結(jié)構(gòu) 缺點(diǎn) 一般當(dāng)項(xiàng)目越來(lái)越大的時(shí)候,無(wú)可避免的會(huì)遇到如下的痛點(diǎn): 代碼沖突多家淤,編譯慢异剥。 每一次拉下代碼開(kāi)...
    spades_K閱讀 745評(píng)論 0 1
  • 看了 Limboy(文章1文章2) 和 Casa (文章) 對(duì) iOS 組件化方案的討論,寫(xiě)篇文章梳理下思路絮重。 首...
    Arthurcsh閱讀 458評(píng)論 0 0
  • 吃瓜 看了Casa和Limboy's關(guān)于組件化的討論冤寿,有種神仙打架,小鬼吃瓜的既視感青伤,在這談?wù)勎覍?duì)于組件化的理解督怜。...
    beginBird閱讀 3,175評(píng)論 1 11