iOS路由技术
目的
就像一个公司规模大到一定程度,就会组建集团公司,将公司拆分成多个小公司。
系统的复杂性超过一定程度后,就自然而然的的将系统拆分成小的子系统。
Java选择微服务组建模块化,而iOS相应的采用的是组件化。
微服务需要满足高内聚,低耦合和单一职责设计原则。
尽量隔离各个组件间的联系,还需要其能沟通自如.所以需要设计模块间通讯的功能我们一般叫它路由。
路由技术
蘑菇街方案
说到路由,很自然会想到java微服务中的路由。其结构如下
根据URL进行服务注册、服务发现。
这些思想都可以,应用到iOS的组件化中。
根据这个思想,实现的微服务,其核心代码可以简化如下
1
2
3
4
5
6
7
8
9
10
11
12
13
14
//Mediator.m 中间件
@implementation Mediator
typedef void (^componentBlock) (id param);
@property (nonatomic, storng) NSMutableDictionary *cache
- (void)registerURLPattern:(NSString *)urlPattern toHandler:(componentBlock)blk {
[cache setObject:blk forKey:urlPattern];
}
- (void)openURL:(NSString *)url withParam:(id)param {
componentBlock blk = [cache objectForKey:url];
if (blk) blk(param);
}
@end
其中核心思想:
根据URL,将block存入一个多层的字典中实现服务注册。
根据多层字典查找block实现服务发现。
这种方案最大的优点是,简单易于理解,对初学者最友好。而且对远程调用,和本地调用做了统一化处理。
缺点的话,Casa已经做了全面化说明
但是在大多数情况下,它的缺点可以忽略。但是如果路由是重度使用,就无法忍受了。
casatwy组件化方案
casatwy的路由方案,核心代码量也很小,只有200多行代码。短小精悍,代码也很容易看懂。
其核心就一个函数
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
- (id)performTarget:(NSString *)targetName action:(NSString *)actionName params:(NSDictionary *)params
{
// Class
NSString *targetClassString = [NSString stringWithFormat:@"Target_%@", targetName];
Class targetClass = NSClassFromString(targetClassString);
NSObject *target = [[targetClass alloc] init];
// SEL
NSString *actionString = [NSString stringWithFormat:@"Action_%@:", actionName];
SEL action = NSSelectorFromString(actionString);
return [target performSelector:action withObject:params];
}
1
2
3
4
5
6
7
8
@implementation Target_AClasss
- (UIViewController *)Action_nativeFetchViewController:(NSDictionary *)params
{
DemoModuleADetailViewController *viewController = [[DemoModuleADetailViewController alloc] init];
viewController.valueLabel.text = params[@"key"];
return viewController;
}
@end
Target(class)+Action(function)实现服务注册
根据设置类名称和方法名称调用performTarget(runtime)实现服务发现
我们最后的路由实现为了方便管理添加了协议。
总结
从代码来看,这些代码其实很相似。都是实现了一个服务注册,和服务发现功能。
其差别其实非常细微。是一些设计思想的上差别,这个就很绕了。如果一开始就纠结于此,会很难搞懂路由的终极目的。
入门还是看bang神的总结博客比较好
如果一开始就看casatwy的iOS 组件化方案探索。很容易晕。
方案
1、URL作为跳转路径的
2、直接指定方法名(运行时target、action方案)
3、两种方案的对比(这一遍讲的最明白)