Router的缺點(diǎn):
在組件化的實(shí)施過程中码邻,注冊(cè)URL并不是充分必要條件。組件是不需要向組件管理器注冊(cè)URL的另假,注冊(cè)了URL之后像屋,會(huì)造成不必要的內(nèi)存常駐。注冊(cè)URL的目的其實(shí)是一個(gè)服務(wù)發(fā)現(xiàn)的過程边篮,在iOS領(lǐng)域中己莺,服務(wù)發(fā)現(xiàn)的方式是不需要通過主動(dòng)注冊(cè)的,使用runtime就可以了戈轿。另外凌受,注冊(cè)部分的代碼的維護(hù)是一個(gè)相對(duì)麻煩的事情,每一次支持新調(diào)用時(shí)思杯,都要去維護(hù)一次注冊(cè)列表胜蛉。如果有調(diào)用被棄用了挠进,是經(jīng)常會(huì)忘記刪項(xiàng)目的。runtime由于不存在注冊(cè)過程誊册,那就也不會(huì)產(chǎn)生維護(hù)的操作领突,維護(hù)成本就降低了。 由于通過runtime做到了服務(wù)的自動(dòng)發(fā)現(xiàn)案怯,拓展調(diào)用接口的任務(wù)就僅在于各自的模塊君旦,任何一次新接口添加,新業(yè)務(wù)添加嘲碱,都不必去主工程做操作金砍,十分透明。
在iOS領(lǐng)域里麦锯,一定是組件化的中間件為openURL提供服務(wù)恕稠,而不是openURL方式為組件化提供服務(wù)。如果在給App實(shí)施組件化方案的過程中是基于openURL的方案的話离咐,有一個(gè)致命缺陷:非常規(guī)對(duì)象(不能被字符串化到URL中的對(duì)象谱俭,例如UIImage)無法參與本地組件間調(diào)度。
在本地調(diào)用中使用URL的方式其實(shí)是不必要的宵蛀,如果業(yè)務(wù)工程師在本地間調(diào)度時(shí)需要給出URL昆著,那么就不可避免要提供params,在調(diào)用時(shí)要提供哪些params是業(yè)務(wù)工程師很容易懵逼的地方术陶。
為了支持傳遞非常規(guī)參數(shù)凑懂,蘑菇街的方案采用了protocol,這個(gè)會(huì)侵入業(yè)務(wù)梧宫。由于業(yè)務(wù)中的某個(gè)對(duì)象需要被調(diào)用接谨,因此必須要符合某個(gè)可被調(diào)用的protocol,然而這個(gè)protocol又不存在于當(dāng)前業(yè)務(wù)領(lǐng)域塘匣,于是當(dāng)前業(yè)務(wù)就不得不依賴public Protocol脓豪。這對(duì)于將來的業(yè)務(wù)遷移是有非常大的影響的。
CTMediator的優(yōu)點(diǎn):
調(diào)用時(shí)忌卤,區(qū)分了本地應(yīng)用調(diào)用和遠(yuǎn)程應(yīng)用調(diào)用扫夜。本地應(yīng)用調(diào)用為遠(yuǎn)程應(yīng)用調(diào)用提供服務(wù)。
組件僅通過Action暴露可調(diào)用接口驰徊,模塊與模塊之間的接口被固化在了Target-Action這一層笤闯,避免了實(shí)施組件化的改造過程中,對(duì)Business的侵入棍厂,同時(shí)也提高了組件化接口的可維護(hù)性颗味。
方便傳遞各種類型的參數(shù)。
更多:iOS面試題合集