?{
?? ? mgj =? ? {
?? ? ? ? "~" =? ? ? ? {
?? ? ? ? ? ? category =? ? ? ? ? ? {
?? ? ? ? ? ? ? ? travel =? ? ? ? ? ? ? ? {
?? ? ? ? ? ? ? ? ? ? "_" = "<__NSMallocBlock__: 0x600000640e70>";
?? ? ? ? ? ? ? ? };
?? ? ? ? ? ? };
?? ? ? ? };
?? ? };
?}
?mgj://foo/bar? mgj://search/:query? mgj://category/travel
?蘑菇街存儲回調(diào)handler的routes數(shù)據(jù)結(jié)構(gòu):其中scheme-自定義協(xié)議頭(如mgj)没卸、host-主機地址(如demo中的foo/category/search)继效、path-路徑(如bar/:query/travel)
?1、強制約定了兩個占位符:"~"和"_",構(gòu)成了硬編碼吆玖,對不了解實現(xiàn)的人或則學習維護實現(xiàn)的人,閱讀起來晦澀難懂、一臉懵逼杜跷。
?2、存儲回調(diào)handler的routes數(shù)據(jù)結(jié)構(gòu)采用四層嵌套結(jié)構(gòu)(scheme/~/host/path四層),嵌套太深,導致存儲和獲取handler_block的代碼都難以閱讀和維護葛闷。作者的設計本意是好的憋槐,把每一個host下的多個path放在一個一起,便于數(shù)據(jù)的集中管理和層次隔離淑趾;
?作者的理念是沒錯的阳仔,但是作者忽略了router的使用場景,本身這router組件就是服務業(yè)務組件的扣泊,也就是說使用該router組件時近范,是業(yè)務組件依賴該router組件,而在同一個工程中旷赖,例如expressfreight://freight.com/xxx/xxx/xxx?xxx=xxx&xxx=xxx,自定義的協(xié)議頭是固定的顺又,host一般也是固定的,變化的是path部分更卒,因此只需要把path部分打平成一個以path為key等孵、handle_block為value的key-value的字典存儲結(jié)構(gòu)就可以了,簡潔便于維護和開發(fā)蹂空。
?注意:自定義的協(xié)議頭俯萌,必須在xcode的工程配置中info-->URL Types中配置,這樣上枕,在使用方在使用openURL:來打開組件時咐熙,才能在application:openURL:options:接收到該事件。也正因為如此辨萍,同一個項目工程棋恼,自定義的協(xié)議頭和host一般是固定的。
?{
?scheme= {
?"~"= {
?host_1= {
?path_1= {
?"_" = "<__NSMallocBlock__: 0xXXXXXXXX";
?},
?path_2= {
?"_" = "<__NSMallocBlock__: 0xXXXXXXXX";
?}
?},
?host_2= {
?path= {
?"_" = "<__NSMallocBlock__: 0xXXXXXXXX";
?}
?}
?}
?}
?}
protocol/scheme/target_action方式比較和篩選:
1锈玉、純iOS端組件間調(diào)用爪飘,使用protocol,可以傳圖片等非基礎數(shù)據(jù)類型參數(shù);但不能跨端使用
2拉背、跨端师崎,比如短信鏈接、端外push椅棺、h5犁罩、瀏覽器、其他APP等跨端跳轉(zhuǎn)到APP的某一個頁面两疚,就必須使用scheme床估,采用openUrl方式打開
3、target_action方式诱渤,解耦比較徹底顷窒,完全利用系統(tǒng)的performSelector,不需要維護一個注冊表,但也導致了一些特殊場景,比如需要拿到先前創(chuàng)建過的實例進行跳轉(zhuǎn)鞋吉,雖然CTMediator組件中提供了cachedTarget來緩存實例鸦做,但是這個實例是第一次調(diào)用CTMediator后才存儲的,實際場景這個實例是外界創(chuàng)建的谓着,這樣使用CTMediator就拿不到這個外界創(chuàng)建的實例了泼诱。如果?CTMediator也維護一個外界注冊的實例表,和protocol和scheme的方式差異也不大了