美文网首页
组件化方案

组件化方案

作者: JopYin | 来源:发表于2019-08-08 15:31 被阅读0次

    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

    相关文章

      网友评论

          本文标题:组件化方案

          本文链接:https://www.haomeiwen.com/subject/vaexjctx.html