组件化方案

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

你可能感兴趣的:(组件化方案)