项目随着版本不断的迭代,大多数类于类之间都会存在着依赖,这样会使项目很难来管理和维护,不同业务层很难抽出成独立的模块,非常影响之后的开发效率,因为代码中充斥着臃肿而复杂的业务代码,每个控制器层都会 依赖很多很多的文件。
翻了一下别人的解决方案,router 来解决我觉的挺好的。每个控制都注册在路由中心注册,参数以dic形式来传递,这样貌似就解决了控制层之间的相互依赖。那么怎么来设计router呢? 我们来简单看看这个SDRouter把
typedefvoid(^SDCompleteCallback)(SDRouterContext*context);
@interfaceSDRouter :NSObject
+ (instancetype)shareRutor;
- (void)addPaten:(NSString*)paten callback:(SDCompleteCallback)callback;
- (void)rutor:(NSURL*)paten;
@end
对外就两个方法 ,添加paten(每个控制器类生成的对应的paten),callBack 是 第二个方法 rutorL:要执行的代码块保存
+ (void)load {
[[SDRoutershareRutor]addPaten:OneControllercallback:^(SDRouterContext*context) {
NSLog(@"----: %@",context.paramters);
OneViewController*textOneVc = [[OneViewControlleralloc]init];
textOneVc.navigationItem.title= context.paramters[@"title"];
[context.topNavigationControllerpushViewController:textOneVcanimated:YES];
}];
}
控制器类在 load的时候就会被注册到路由中心。
实现原理:
用一个集合类缓存路由跟处理闭包的对应关系,在app启动的时候,注册好支持的URL,当调用openURL的时候,根据给定的URL查找到对应的闭包,执行闭包代码,实现跳转。找不到对应的闭包的时候,可以定义一个公共的错误页面。
那么路由可以解决什么问题呢?
跳转的时候不用依赖具体的目标类
从外部(web或者其他app,推送)打开App指定
App复杂后组件化后,组件解藕
统一买点可以通过路由进行,因为路由是一个中间件,所以对路由进行AOP就可以
做统一的错误处理页面
那缺点呢?
传参: 因为要传入的参数多样行,所以一般 以字典形式传入
URL的组成: