1.Target-Action
- 通过中间层进行调用
- 中间层使用runtime反射 (就是下面代码)
- 中间层代码优化
主要是调用一下那个传入获取target ,传入target响应的action 方法 并传入一些参数
Class targetClass = NSClassFromString(targetClassString);
target = [[targetClass alloc] init];
SEL action = NSSelectorFromString(actionString);
[target performSelector:action withObject:params]
可以查看CTMediator组件化方案代码理解
2.URL Scheme
- 使URL处理本地的跳转
- 通过中间层进行注册&调用
- 注册表无需使用反射
1.在中间层写注册方法 把urlScheme 和block 存入到字典中
dic = @{"urlScheme":block};
+ (NSMutableDictionary *)mediatorCache{
static NSMutableDictionary *cache;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
cache = @{}.mutableCopy;
});
return cache;
}
//URL Scheme
+ (void)registerScheme:(NSString *)scheme processBlock:(GTMediatorProcessBlock)processBlock{
if (scheme && processBlock) {
[[[self class] mediatorCache] setObject:processBlock forKey:scheme];
}
}
2、在类load方法中调用中间层的注册方法注册并在block中实现跳转等相关业务逻辑
+ (void)load {
[GTMediator registerScheme:@"detail://" processBlock:^(NSDictionary * _Nonnull params) {
NSString *url = (NSString *)[params objectForKey:@"url"];
UINavigationController *navigationController = (UINavigationController *)[params objectForKey:@"controller"];
GTDetailViewController *controller = [[GTDetailViewController alloc] initWithUrlString:url];
[navigationController pushViewController:controller animated:YES];
}];
}
上述中的detail://就类似通过urlScheme进行app之间的跳转方式 这个scheme就是注册到字典中的key ,后面需要用到这个key取到注册的block并调用
3.在中间层 写上打开openURLScheme方法以供上层控制器调用
+ (void)openUrl:(NSString *)url params:(NSDictionary *)params{
GTMediatorProcessBlock block = [[[self class] mediatorCache] objectForKey:url];
if (block) {
block(params);
}
}
4.通过和注册时候对应的好的urlScheme:detail://进入到对应页面并传入对应参数
[GTMediator openUrl:@"detail://"
params:@{
@"url":item.articleUrl,
@"controller":self.navigationController
}];
3.Protocol-Class
有一点类似urlScheme
1.在中间层编写注册方法将 类作为value protocol作为key存入到字典 然后在load方法中调用该注册方法 注册protocol和[self class]
2.在中间层写取方法获取class 调用者调用该方法通过protocol获取对应class
3.在中间层写protocol和协议方法 ,class要遵循改protocol并实现协议方法
注:代码就不上传 有兴趣可以研究一下阿里BeeHive
网友评论