蘑菇街組件化筆記

路由的基礎(chǔ)知識

iOS 系統(tǒng)里面支持的URL Scheme方式,我們可以看出,對于一個資源的訪問,蘋果也是用URI的方式來訪問的。
統(tǒng)一資源標識符(英語:Uniform Resource Identifier,或URI)是一個用于標識某一互聯(lián)網(wǎng)資源名稱的字符串。 該種標識允許用戶對網(wǎng)絡(luò)中(一般指萬維網(wǎng))的資源通過特定的協(xié)議進行交互操作。URI的最常見的形式是統(tǒng)一資源定位符(URL)。

1488337532106663.png

路由開源的庫:
http://www.cocoachina.com/ios/20170301/18811.html (參考如下的文章)

組件之間的通信

URL路由的方式

注冊:MGJRouter

各個組件初始化時向 Mediator 注冊對外提供的接口,Mediator 通過保存在內(nèi)存的表去知道有哪些模塊哪些接口,接口的形式是 URL->block。

這種方案思路就是:Mediator 不能直接去調(diào)用組件的方法,因為這樣會產(chǎn)生依賴,那我就要通過其他方法去調(diào)用,也就是通過 字符串->方法 的映射去調(diào)用。runtime 接口的 className + selectorName -> IMP 是一種,注冊表的 key -> block 是一種,而前一種是 OC 自帶的特性,后一種需要內(nèi)存維持一份注冊表。

從數(shù)據(jù)結(jié)構(gòu)來看

@interface MGJRouter ()
/**
 *  保存了所有已注冊的 URL
 *  結(jié)構(gòu)類似 @{@"beauty": @{@":id": {@"_", [block copy]}}}
 */
@property (nonatomic) NSMutableDictionary *routes;
@end
/**
 *  打開此 URL,帶上附加信息,同時當操作完成時,執(zhí)行額外的代碼
 *
 *  @param URL        帶 Scheme 的 URL,如 mgj://beauty/4
 *  @param userInfo 附加參數(shù)
 *  @param completion URL 處理完成后的 callback,完成的判定跟具體的業(yè)務(wù)相關(guān)
 */
+ (void)openURL:(NSString *)URL withUserInfo:(NSDictionary *)userInfo completion:(void (^)(id result))completion;
1488345388154476.png
蘑菇街為了區(qū)分開頁面間調(diào)用和組件間調(diào)用,于是想出了一種新的方法。用Protocol的方法來進行組件間的調(diào)用。

每個組件之間都有一個 Entry,這個 Entry,主要做了三件事:

  • 注冊這個組件關(guān)心的 URL

  • 注冊這個組件能夠被調(diào)用的方法/屬性

  • 在 App 生命周期的不同階段做不同的響應(yīng)

頁面間的openURL調(diào)用就是如下的樣

1488345427296974.png

每個組件間都會向MGJRouter注冊,組件間相互調(diào)用或者是其他的App都可以通過openURL:方法打開一個界面或者調(diào)用一個組件。

在組件間的調(diào)用,蘑菇街采用了Protocol的方式。

1488345587646575.png

[ModuleManager registerClass:ClassA forProtocol:ProtocolA] 的結(jié)果就是在 MM 內(nèi)部維護的 dict 里新加了一個映射關(guān)系。

[ModuleManager classForProtocol:ProtocolA] 的返回結(jié)果就是之前在 MM 內(nèi)部 dict 里 protocol 對應(yīng)的 class,使用方不需要關(guān)心這個 class 是個什么東東,反正實現(xiàn)了 ProtocolA 協(xié)議,拿來用就行。

這里需要有一個公共的地方來容納這些 public protocl,也就是圖中的 PublicProtocl.h。

我猜測,大概實現(xiàn)可能是下面的樣子:

[圖片上傳中...(1488350374526176.png-ba68e1-1530103740148-0)]

然后這個是一個單例,在里面注冊各個協(xié)議:


[圖片上傳中...(1488350511106764.png-9f1356-1530103814895-0)]

在ModuleProtocolManager中用一個字典保存每個注冊的protocol。現(xiàn)在再來猜猜ModuleEntry的實現(xiàn)


1488350511106764.png

然后每個模塊內(nèi)都有一個和暴露到外面的協(xié)議相連接的“接頭”。


1488346149928315 (1).png

在它的實現(xiàn)中,需要引入3個外部文件,一個是ModuleProtocolManager,一個是DetailModuleEntryProtocol,最后一個是所在模塊需要跳轉(zhuǎn)或者調(diào)用的組件或者頁面。

1488346189157631.png

至此基于Protocol的方案就完成了。如果需要調(diào)用某個組件或者跳轉(zhuǎn)某個頁面,只要先從ModuleProtocolManager的字典里面根據(jù)對應(yīng)的ModuleEntryProtocol找到對應(yīng)的DetailModuleEntry,找到了DetailModuleEntry就是找到了組件或者頁面的“入口”了。再把參數(shù)傳進去即可。

1488346213448859.png

這樣就可以調(diào)用到組件或者界面了。

如果組件之間有相同的接口,那么還可以進一步的把這些接口都抽離出來。這些抽離出來的接口變成“元接口”,它們是可以足夠支撐起整個組件一層的。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容