背景
隨著開(kāi)發(fā)項(xiàng)目越來(lái)越大酣衷,功能越來(lái)越復(fù)雜,慢慢的暴露了很多的問(wèn)題:編譯速度如何更快族檬?模塊之間如何減低耦合度拆撼?如何對(duì)業(yè)務(wù)組件進(jìn)行單獨(dú)測(cè)試...。所以公司組內(nèi)的小伙伴研究了一下新項(xiàng)目的架構(gòu)選型,決定用組件化的架構(gòu)。隨著組件化的完成我也有時(shí)間寫一寫組件化中間件的選型,以及這些中間件的區(qū)別以及用法担锤。
基礎(chǔ)組件:工具類分類網(wǎng)絡(luò)統(tǒng)一配置
一、中間件
首先組件化其實(shí)就是將APP按照業(yè)務(wù)模塊劃分成幾個(gè)主要的組件乍钻,同時(shí)這些組件之間是完全解耦的肛循,那么如果這些完全解耦的組件和組件之間要進(jìn)行交互而且不能耦合,我們?nèi)绾翁幚砟且瘢课覀冃枰柚虚g件來(lái)完成組件和組件的交換操作多糠。
二、MGJRouter
MGJRouter是蘑菇街的Limboy大神團(tuán)隊(duì)開(kāi)發(fā)的一個(gè)中間件浩考,是一個(gè)單例類夹孔,使用時(shí)所有的組件向ModuleManager注冊(cè)Url。當(dāng)組件A需要調(diào)用組件B時(shí),向ModuleManager傳遞URL搭伤,參數(shù)跟隨URL以GET方式傳遞只怎,類似openURL。然后由ModuleManager負(fù)責(zé)調(diào)度組件B怜俐,最后完成任務(wù)身堡。本質(zhì)上是在單例類中建立一個(gè)url路由表進(jìn)行關(guān)聯(lián),調(diào)用openURL方法佑菩,傳入?yún)?shù)盾沫。
為了模擬不同組件之間的調(diào)用裁赠,在工程中新建三個(gè)類package1ViewController殿漠、package2ViewController、package3ViewController佩捞,以及作為在程序啟動(dòng)時(shí)在內(nèi)存中注冊(cè)MGJRouter URL的類ModuleRouterManager绞幌。我們把package1ViewController、package2ViewController一忱、package3ViewController看成三個(gè)組件中的類文件莲蜘,viewController看成需要與另外三個(gè)組件交互的組件中的類。
第一種用法:注冊(cè)URL和openURL并傳遞參數(shù)
注意:URLPattern?帶上 scheme帘营,如 mgj://beauty/:id票渠,千萬(wàn)不能和其他注冊(cè)的URL寫重了。
handler中默認(rèn)攜帶的信息如下
其中MGJRouterParameterUserInfo為我們openURL:時(shí)攜帶的信息芬迄,MGJRouterParameterURL為我們注冊(cè)的URL
具體的實(shí)現(xiàn)register方法為
注冊(cè)的方法是放在ModuleRouterManager.m 的+(void)load 方法中來(lái)實(shí)現(xiàn)將URL注冊(cè)到MGJRouter路由表里的问顷。
接下來(lái)我們看一下具體的觸發(fā)操作
URL為register到MGJRouter 代理類中路由表里的URL,參數(shù)為想要傳遞到register 方法handler中的參數(shù)信息
第二種用法:在當(dāng)前組件中回調(diào)信息給上一個(gè)組件
場(chǎng)景:從當(dāng)前組件跳轉(zhuǎn)到下一個(gè)組件之后禀梳,點(diǎn)擊觸發(fā)一個(gè)回調(diào)到上一個(gè)組件里杜窄,并攜帶參數(shù)
在跳轉(zhuǎn)到的組件類中創(chuàng)建block閉包
manager中注冊(cè)URL,唯一不同的是需要在handler中為跳轉(zhuǎn)到的下一個(gè)組件中的閉包賦值算途。
觸發(fā)跳轉(zhuǎn)到下一個(gè)組件界面操作的代碼
第三種用法:將register方法handler中返回參數(shù)作為調(diào)用objectForURL:之后的生成對(duì)象
應(yīng)用場(chǎng)景:在當(dāng)前組件中實(shí)現(xiàn)跳轉(zhuǎn)下一個(gè)組件塞耕,而不是在registerURL中實(shí)現(xiàn)跳轉(zhuǎn)
應(yīng)用到的函數(shù):
其中,handler會(huì)返回一個(gè)id對(duì)象嘴瓤。
第一步注冊(cè)URL進(jìn)入路由表
調(diào)用objectForURL獲取到在register中handler返回的對(duì)象
一般用到的就這三種場(chǎng)景了扫外,MGJouter中間件提供的API都比較簡(jiǎn)單,所以對(duì)新手來(lái)說(shuō)更容易上手廓脆,但是缺點(diǎn)就是:
1筛谚、需要往中間件中注冊(cè)URL路由表才能實(shí)現(xiàn)我們想要的功能,注冊(cè)URL過(guò)多可能會(huì)導(dǎo)致內(nèi)存常駐狞贱,造成不必要的內(nèi)存開(kāi)銷刻获;
2、注冊(cè)URL的這種方式對(duì)后期的維護(hù)造成很大的麻煩,需要我們不停地去確定注冊(cè)和打開(kāi)的URL是否一致蝎毡。
3厚柳、用URL注冊(cè)的方式其實(shí)是為了讓調(diào)用者發(fā)現(xiàn)當(dāng)前的服務(wù),如果要達(dá)到這種效果我們可以采用runtime動(dòng)態(tài)的獲取我們項(xiàng)目中的服務(wù)沐兵。
在下一篇文章中我會(huì)繼續(xù)總結(jié)另外一種基于runtime的組件化中間件方案 - CTMediator别垮,可以看看其中的區(qū)別以及各自的優(yōu)缺點(diǎn)。
參考鏈接:
下邊demo的地址扎谎,可以下載看一下:
歡迎關(guān)注我的公眾號(hào)碳想,專注iOS開(kāi)發(fā)、大前端開(kāi)發(fā)毁靶、跨平臺(tái)技術(shù)分享胧奔。