項(xiàng)目隨著版本不斷的迭代,大多數(shù)類(lèi)于類(lèi)之間都會(huì)存在著依賴(lài),這樣會(huì)使項(xiàng)目很難來(lái)管理和維護(hù)纳猫,不同業(yè)務(wù)層很難抽出成獨(dú)立的模塊,非常影響之后的開(kāi)發(fā)效率竹捉,因?yàn)榇a中充斥著臃腫而復(fù)雜的業(yè)務(wù)代碼续担,每個(gè)控制器層都會(huì) 依賴(lài)很多很多的文件。
翻了一下別人的解決方案活孩,router 來(lái)解決我覺(jué)的挺好的物遇。每個(gè)控制都注冊(cè)在路由中心注冊(cè),參數(shù)以dic形式來(lái)傳遞憾儒,這樣貌似就解決了控制層之間的相互依賴(lài)询兴。那么怎么來(lái)設(shè)計(jì)router呢? 我們來(lái)簡(jiǎn)單看看這個(gè)SDRouter把
typedefvoid(^SDCompleteCallback)(SDRouterContext*context);
@interfaceSDRouter :NSObject
+ (instancetype)shareRutor;
- (void)addPaten:(NSString*)paten callback:(SDCompleteCallback)callback;
- (void)rutor:(NSURL*)paten;
@end
對(duì)外就兩個(gè)方法 起趾,添加paten(每個(gè)控制器類(lèi)生成的對(duì)應(yīng)的paten)诗舰,callBack 是 第二個(gè)方法 rutorL:要執(zhí)行的代碼塊保存
+ (void)load {
[[SDRoutershareRutor]addPaten:OneControllercallback:^(SDRouterContext*context) {
NSLog(@"----: %@",context.paramters);
OneViewController*textOneVc = [[OneViewControlleralloc]init];
textOneVc.navigationItem.title= context.paramters[@"title"];
[context.topNavigationControllerpushViewController:textOneVcanimated:YES];
}];
}
控制器類(lèi)在 load的時(shí)候就會(huì)被注冊(cè)到路由中心。
實(shí)現(xiàn)原理:
用一個(gè)集合類(lèi)緩存路由跟處理閉包的對(duì)應(yīng)關(guān)系训裆,在app啟動(dòng)的時(shí)候眶根,注冊(cè)好支持的URL,當(dāng)調(diào)用openURL的時(shí)候边琉,根據(jù)給定的URL查找到對(duì)應(yīng)的閉包属百,執(zhí)行閉包代碼,實(shí)現(xiàn)跳轉(zhuǎn)变姨。找不到對(duì)應(yīng)的閉包的時(shí)候族扰,可以定義一個(gè)公共的錯(cuò)誤頁(yè)面。
那么路由可以解決什么問(wèn)題呢?
跳轉(zhuǎn)的時(shí)候不用依賴(lài)具體的目標(biāo)類(lèi)
從外部(web或者其他app渔呵,推送)打開(kāi)App指定
App復(fù)雜后組件化后怒竿,組件解藕
統(tǒng)一買(mǎi)點(diǎn)可以通過(guò)路由進(jìn)行,因?yàn)槁酚墒且粋€(gè)中間件扩氢,所以對(duì)路由進(jìn)行AOP就可以
做統(tǒng)一的錯(cuò)誤處理頁(yè)面
那缺點(diǎn)呢耕驰?
傳參: 因?yàn)橐獋魅氲膮?shù)多樣行,所以一般 以字典形式傳入
URL的組成: